PostgreSQL håndhæver dataintegritet gennem constraints — regler for tabeldata. Ud over de standard constraints (, , , , , ), tilføjer Postgres kraftfulde muligheder som constraints og fleksible udtryk.
PostgreSQL håndhæver dataintegritet gennem constraints — regler for tabeldata. Ud over de standard constraints (, , , , , ), tilføjer Postgres kraftfulde muligheder som constraints og fleksible udtryk.
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 constraints kan håndhæve komplekse forretningsregler, herunder betingelser på tværs af kolonner og regex-mønstre.
-- 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 constraints (en Postgres-specifik funktion) forhindrer rækker, der konflikter efter en brugerdefineret operator — især kendt for at forhindre overlappende tidsintervaller (dobbelt-bookinger), hvilket en UNIQUE constraint ikke kan gøre.
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
Constraints er essentielle for dataintegritet — de håndhæver dataregler på databaseniveauet (sidste forsvarslinje, altid håndhævet uanset applikationskode), så forståelse af PostgreSQL's constraint-understøttelse er vigtig for designet af robuste databaser.
At kende standard constraints (PRIMARY KEY, FOREIGN KEY med referentiel integritet, UNIQUE, NOT NULL, CHECK, DEFAULT) og hvad hver enkelt håndhæver, er fundamentalt for skemadesjgn, og giver databaseniveaugarantier (unikhed, gyldige referencer, påkrævede værdier, gyldige data), der beskytter mod bugs, race conditions og inkonsistente data på måder, som applikationskode alene ikke kan.
PostgreSQL's CHECK constraints er særligt dygtige, og håndhæver komplekse forretningsregler, herunder betingelser på tværs af kolonner (logisk konsistens som end_date > start_date) og selv regex-mønstre — så du kan kode domæneregler direkte i skemaet.
Særligt værdifuldt er den Postgres-specifik EXCLUDE constraint, som forhindrer konflikterende rækker efter brugerdefinerede operatorer — især forhindring af overlappende tidsintervaller (dobbelt-bookinger for et rum/ressource), en kraftfuld funktion, som en standard UNIQUE constraint ikke kan levere, og som elegant løser et almindeligt virkelighedsproblem (planlægning, reservationer) på databaseniveauet.
Forståelse af constraints — standard constraints for integritet, Postgres's fleksible CHECK-udtryk, og den kraftfulde EXCLUDE for konfliktforebyggelse — er vigtig for design af databaser, der automatisk håndhæver korrekthed.
Da dataintegritet er kritisk, og constraints giver garantier, som applikationskode ikke kan, og da Postgres tilbyder kraftfulde muligheder (rige CHECK, EXCLUDE for overlaps) ud over det grundlæggende, er forståelse af PostgreSQL's constraint-understøttelse værdifuld, praktisk relevant viden for opbygning af robuste databaser, hvor EXCLUDE constraint i særdeleshed er en karakteristisk, nyttig Postgres-funktion værd at kende for planlasgnings-/reservationssystemer.