I vincoli sono regole applicate dal database sui dati nelle tabelle, garantendo l'integrità dei dati a livello di database (non solo nel codice applicativo). I principali sono: PRIMARY KEY, FOREIGN KEY, UNIQUE, , e .
I vincoli sono regole applicate dal database sui dati nelle tabelle, garantendo l'integrità dei dati a livello di database (non solo nel codice applicativo). I principali sono: PRIMARY KEY, FOREIGN KEY, UNIQUE, , e .
NOT NULLCHECKDEFAULTCREATE TABLE users (
id INT PRIMARY KEY, -- unique + not null identifier
email VARCHAR(255) UNIQUE NOT NULL, -- must be unique AND present
age INT CHECK (age >= 0 AND age <= 120), -- must satisfy a condition
country VARCHAR(2) DEFAULT 'US', -- default value if not provided
role VARCHAR(20) NOT NULL DEFAULT 'user',
manager_id INT REFERENCES users(id) -- FOREIGN KEY (referential integrity)
);
PRIMARY KEY → uniquely identifies a row (unique + not null, indexed)
FOREIGN KEY → references another table's key (referential integrity)
UNIQUE → no duplicate values allowed in this column
NOT NULL → the column must have a value (can't be NULL)
CHECK → the value must satisfy a condition (age >= 0, status IN (...))
DEFAULT → a value used when none is provided on insert
-- ❌ relying only on application code to enforce uniqueness:
-- a race condition or a bug or a different app could insert a duplicate
-- ✅ a UNIQUE constraint guarantees it at the DB level — ALWAYS enforced,
-- regardless of which code or how many apps access the database
email VARCHAR(255) UNIQUE
I vincoli del database sono l'ultima linea di difesa per l'integrità dei dati — vengono applicati indipendentemente da quale codice inserisce i dati (più applicazioni, script, modifiche manuali o codice buggy), e gestiscono le race condition che i controlli a livello applicativo perdono.
CHECK (price > 0) -- prices must be positive
CHECK (status IN ('active', 'inactive')) -- only valid statuses
CHECK (end_date > start_date) -- logical consistency
CHECK applica le regole di business/dominio direttamente nello schema.
I vincoli sono essenziali per mantenere l'integrità dei dati — garantiscono che i dati nel database soddisfino regole (univocità, presenza, valori validi, riferimenti validi) a livello di database, fondamentale per applicazioni affidabili, quindi comprenderli è importante.
Conoscere i tipi di vincoli (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK, DEFAULT) e cosa ognuno applica è necessario per un corretto design dello schema.
Il punto concettuale più importante è perché applicare i vincoli a livello di database piuttosto che solo nel codice applicativo: i vincoli del database sono l'ultima linea di difesa per l'integrità dei dati — vengono sempre applicati indipendentemente da quale codice o da quante applicazioni accedono ai dati, catturano i bug che i controlli applicativi potrebbero perdere, e crucialmente gestiscono le race condition che la validazione a livello applicativo non può (ad es. due inserimenti simultanei che passano un controllo di univocità a livello app ma un vincolo UNIQUE correttamente rifiuta il duplicato).
Affidare esclusivamente al codice applicativo l'integrità è rischioso; i vincoli forniscono una garanzia.
Comprendere i vincoli CHECK per applicare regole di dominio/business (intervalli validi, valori consentiti, coerenza logica) direttamente nello schema è inoltre prezioso.
Poiché l'integrità dei dati è critica per applicazioni affidabili, e poiché i vincoli forniscono garanzie a livello di database che proteggono contro i bug, le race condition e i dati incoerenti in modi che il solo codice applicativo non può, comprendere i vincoli — i tipi, le loro garanzie di integrità e l'importanza dell'applicazione a livello di database — è una conoscenza importante e fondamentale per progettare database robusti e un aspetto chiave della costruzione di applicazioni i cui dati rimangono coerenti e validi.