PostgreSQL, kısıtlamalar aracılığıyla — tablo verilerine uygulanan kurallar — veri bütünlüğünü zorunlu kılar. Standart olanların (, , , , , ) yanı sıra, Postgres kısıtlamaları ve esnek ifadeleri gibi güçlü seçenekler sunar.
PostgreSQL, kısıtlamalar aracılığıyla — tablo verilerine uygulanan kurallar — veri bütünlüğünü zorunlu kılar. Standart olanların (, , , , , ) yanı sıra, Postgres kısıtlamaları ve esnek ifadeleri gibi güçlü seçenekler sunar.
PRIMARY KEYFOREIGN KEYUNIQUENOT NULLCHECKDEFAULTCHECKCREATE TABLE bookings (
id SERIAL PRIMARY KEY, -- unique identifier
room_id INT NOT NULL REFERENCES rooms(id), -- foreign key (referential integrity)
email VARCHAR(255) UNIQUE NOT NULL, -- unique + required
guests INT CHECK (guests > 0 AND guests <= 10), -- value constraint
status TEXT DEFAULT 'pending' -- default value
);
PRIMARY KEY → unique row identifier
FOREIGN KEY → references another table (referential integrity, with ON DELETE options)
UNIQUE → no duplicate values
NOT NULL → must have a value
CHECK → value must satisfy a condition
DEFAULT → default value when not provided
CHECK (price > 0)
CHECK (end_date > start_date) -- logical consistency between columns
CHECK (status IN ('active', 'inactive', 'pending'))
CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$') -- regex validation
Postgres CHECK kısıtlamaları, sütunlar arası koşullar ve regex desenler de dahil olmak üzere zengin iş kurallarını zorunlu kılabilir.
-- prevent OVERLAPPING bookings for the same room (impossible with UNIQUE alone!)
CREATE TABLE bookings (
room_id INT,
during TSRANGE, -- a time range
EXCLUDE USING GIST (room_id WITH =, during WITH &&) -- no two rows where room_id is
); -- equal AND time ranges OVERLAP
EXCLUDE kısıtlamaları (Postgres'e özgü bir özellik), özel operatörler tarafından çakışan satırları önler — en ünlüsü, örtüşen zaman aralıklarını (çift rezervasyonları) önler, bu da bir UNIQUE kısıtlamasının yapamayacağı bir şeydir.
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
Kısıtlamalar veri bütünlüğü için gereklidir — veri kurallarını veritabanı düzeyinde zorunlu kılarlar (her zaman uygulanması gereken son savunma hattı, uygulama kodu ne olursa olsun), bu nedenle PostgreSQL'in kısıtlama desteğini anlamak güçlü veritabanları tasarlamak için önemlidir.
Standart kısıtlamaları (PRIMARY KEY, FOREIGN KEY referanssal bütünlük ile, UNIQUE, NOT NULL, CHECK, DEFAULT) ve her birinin ne zorunlu kıldığını bilmek, şema tasarımı için temeldir ve veritabanı düzeyinde garantiler (teklik, geçerli referanslar, gerekli değerler, geçerli veriler) sağlar ve bunlar uygulamalar kodunun tek başına yapamayacağı şekilde hatalar, yarış koşulları ve tutarsız veriye karşı koruma sağlar.
PostgreSQL'in CHECK kısıtlamaları özellikle yeteneklidir ve sütunlar arası koşulları (mantıksal tutarlılık gibi end_date > start_date) ve hatta regex desenleri içeren zengin iş kurallarını zorunlu kılar — etki alanı kurallarını doğrudan şemaya kodlamanızı sağlar.
Özellikle değerli olan Postgres'e özgü EXCLUDE kısıtlamasıdır, bu kısıtlama özel operatörler tarafından çakışan satırları önler — en önemli olanı örtüşen zaman aralıklarını (bir oda/kaynak için çift rezervasyonları) önler, bu güçlü bir yetenektir ve standart bir UNIQUE kısıtlaması yapamaz ve bu, yaygın bir gerçek dünya problemini (planlama, rezervasyonlar) veritabanı düzeyinde zarif bir şekilde çözer.
Kısıtlamaları — bütünlük için standart olanları, Postgres'in esnek CHECK ifadeleri ve çakışma önleme için güçlü EXCLUDE — anlamak, doğruluğu otomatik olarak zorunlu kılan veritabanları tasarlamak için önemlidir.
Veri bütünlüğü kritik olduğundan ve kısıtlamalar uygulama kodunun sağlayamayacağı garantiler sağladığından ve Postgres temelden ötesinde güçlü seçenekler (zengin CHECK, örtüşmeler için EXCLUDE) sunduğundan, PostgreSQL'in kısıtlama desteğini anlamak, güçlü veritabanları kurmak için değerli, pratik olarak ilgili bilgidir; EXCLUDE kısıtlaması özellikle, planlama/rezervasyon sistemleri için bilinen değer olan, ayırt edici bir Postgres yeteneğidir.