PostgreSQL vynucuje integritu dat prostřednictvím omezení — pravidel pro data v tabulkách. Kromě standardních omezení (, , , , , ) přidává Postgres výkonné možnosti jako omezení a flexibilní výrazy .
PostgreSQL vynucuje integritu dat prostřednictvím omezení — pravidel pro data v tabulkách. Kromě standardních omezení (, , , , , ) přidává Postgres výkonné možnosti jako omezení a flexibilní výrazy .
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
Omezení CHECK v Postgresu mohou vynucovat bohatá obchodní pravidla, včetně podmínek mezi sloupci a regex vzorů.
-- 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
Omezení EXCLUDE (funkce specifická pro Postgres) zabraňují řádkům, které jsou v konfliktu podle vlastního operátoru — notoricky zabraňují překrývajícím se časovým rozsahům (dvojitým rezervacím), což omezení UNIQUE neumožňuje.
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
Omezení jsou nezbytná pro integritu dat — vynucují pravidla dat na úrovni databáze (poslední linii obrany, která je vždy vynucena bez ohledu na kód aplikace), takže pochopení podpory omezení v PostgreSQL je důležité pro návrh robustních databází.
Znalost standardních omezení (PRIMARY KEY, FOREIGN KEY s referenční integritou, UNIQUE, NOT NULL, CHECK, DEFAULT) a toho, co každé z nich vynucuje, je zásadní pro návrh schématu a poskytuje záruky na úrovni databáze (jedinečnost, platné reference, požadované hodnoty, platná data), které chrání proti chybám, závodním podmínkám a nekonzistentním datům způsobem, který samotný kód aplikace nemůže zajistit.
Omezení CHECK v PostgreSQL jsou obzvláště schopná a vynucují bohatá obchodní pravidla, včetně podmínek mezi sloupci (logická konzistence, jako end_date > start_date) a dokonce i regex vzorů — umožňují vám kódovat pravidla domény přímo do schématu.
Obzvláště cenné je specifické pro Postgres omezení EXCLUDE, které zabraňuje konfliktním řádkům vlastními operátory — nejpozoruhodněji zabraňuje překrývajícím se časovým rozsahům (dvojitým rezervacím místnosti/prostředku), výkonná schopnost, kterou standardní omezení UNIQUE nemůže poskytnout a která elegantně řeší běžný problém v reálném světě (plánování, rezervace) na úrovni databáze.
Pochopení omezení — standardních pro integritu, flexibilních výrazů CHECK v Postgresu a výkonného EXCLUDE pro prevenci konfliktů — je důležité pro navrhování databází, které automaticky vynucují správnost.
Keďže je integrita dat kritická a omezení poskytují záruky, které kód aplikace nemůže, a protože Postgres nabízí výkonné možnosti (bohaté CHECK, EXCLUDE pro překrytí) nad rámec základů, je pochopení podpory omezení v PostgreSQL cenné, prakticky relevantní znalosti pro vytváření robustních databází, přičemž omezení EXCLUDE je obzvláště rozlišující, užitečná schopnost Postgresu, kterou stojí za to znát pro systémy plánování/rezervací.