PostgreSQL applica l'integrità dei dati attraverso vincoli — regole sui dati della tabella. Oltre ai vincoli standard (, , , , , ), Postgres aggiunge opzioni potenti come i vincoli e le espressioni flessibili.
PostgreSQL applica l'integrità dei dati attraverso vincoli — regole sui dati della tabella. Oltre ai vincoli standard (, , , , , ), Postgres aggiunge opzioni potenti come i vincoli e le espressioni flessibili.
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
I vincoli CHECK di Postgres possono applicare regole aziendali complesse, incluse condizioni multi-colonna e pattern regex.
-- 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
I vincoli EXCLUDE (una funzionalità specifica di Postgres) impediscono righe che entrano in conflitto secondo un operatore personalizzato — famosamente, prevenendo intervalli di tempo sovrapposti (doppia prenotazione), cosa che un vincolo UNIQUE non può fare.
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
I vincoli sono essenziali per l'integrità dei dati — applicano le regole sui dati a livello di database (l'ultima linea di difesa, sempre applicata indipendentemente dal codice dell'applicazione), quindi comprendere il supporto dei vincoli di PostgreSQL è importante per progettare database robusti.
Conoscere i vincoli standard (PRIMARY KEY, FOREIGN KEY con integrità referenziale, UNIQUE, NOT NULL, CHECK, DEFAULT) e cosa ciascuno applica è fondamentale per il design dello schema, fornendo garanzie a livello di database (unicità, riferimenti validi, valori obbligatori, dati validi) che proteggono da bug, race condition e dati incoerenti in modo che il codice dell'applicazione da solo non può.
I vincoli CHECK di PostgreSQL sono particolarmente capaci, applicando regole aziendali complesse incluse condizioni multi-colonna (coerenza logica come end_date > start_date) e persino pattern regex — permettendoti di codificare le regole di dominio direttamente nello schema.
Particolarmente prezioso è il vincolo EXCLUDE specifico di Postgres, che impedisce righe in conflitto secondo operatori personalizzati — notevolmente prevenendo intervalli di tempo sovrapposti (doppia prenotazione per una stanza/risorsa), una capacità potente che un vincolo UNIQUE standard non può fornire e che risolve elegantemente un problema comune nel mondo reale (pianificazione, prenotazioni) a livello di database.
Comprendere i vincoli — quelli standard per l'integrità, le espressioni CHECK flessibili di Postgres e l'EXCLUDE potente per la prevenzione dei conflitti — è importante per progettare database che applichino la correttezza automaticamente.
Poiché l'integrità dei dati è critica e i vincoli forniscono garanzie che il codice dell'applicazione non può, e poiché Postgres offre opzioni potenti (CHECK ricco, EXCLUDE per sovrapposizioni) oltre le basi, comprendere il supporto dei vincoli di PostgreSQL è una conoscenza pratica e rilevante per costruire database robusti, con il vincolo EXCLUDE in particolare essendo una capacità distintiva e utile di Postgres che vale la pena conoscere per i sistemi di pianificazione/prenotazione.