Vincoli (constraints) - sono limitazioni di integrità imposte su colonne o tabelle per controllare automaticamente la validità dei valori. Permettono di:
Tipi principali di vincoli:
PRIMARY KEY - identificatore unico, vieta la duplicazione e i NULL.UNIQUE - vieta la duplicazione di valori in una colonna.FOREIGN KEY - integrità referenziale, collegamento con un'altra tabella.CHECK - verifica di un'espressione arbitraria.NOT NULL - divieto di valori NULL in una colonna.CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id), -- foreign key price DECIMAL(10,2) CHECK (price > 0), created_at TIMESTAMP NOT NULL );
"La chiave unica (UNIQUE) è automaticamente NULL-SAFE, escludendo qualsiasi numero di valori NULL nella colonna?"
In realtà, nella maggior parte dei DBMS (ad esempio, PostgreSQL, MySQL) il vincolo UNIQUE permette più righe con valore NULL, poiché il NULL è considerato "sconosciuto". Questo spesso porta a una duplicazione invisibile dei valori vuoti.
CREATE TABLE test ( id INT PRIMARY KEY, code VARCHAR(10) UNIQUE ); INSERT INTO test (id, code) VALUES (1, NULL), (2, NULL); -- passerà
Storia
L'applicazione consentiva la registrazione tramite email, la colonna era UNIQUE, ma NON NOT NULL - nella tabella c'erano una decina di utenti con email NULL, causando problemi durante l'integrazione con i servizi esterni.
Storia
Nel sistema di ordinazione dei biglietti è stato dimenticato di aggiungere il FOREIGN KEY alla tabella dei pagamenti - di conseguenza, sono emersi pagamenti non collegati a nessun ordine, il che impediva di elaborare i rimborsi agli utenti.
Storia
Vincolo CHECK per lo sconto: discount > 0. È stata dimenticata la situazione limite per 0. Risultato: il sistema accettava solo sconti superiori a 0, mentre l'assenza di sconto (0) rompeva la logica aziendale.