ProgrammazioneSviluppatore Fullstack

Che cosa sono i vincoli (constraints) in SQL, quali tipi di vincoli esistono e come aiutano a evitare errori nella logica applicativa? Fornisci esempi di utilizzo.

Supera i colloqui con l'assistente IA Hintsage

Risposta

Vincoli (constraints) - sono limitazioni di integrità imposte su colonne o tabelle per controllare automaticamente la validità dei valori. Permettono di:

  • Proteggere i dati da input errati;
  • Spostare parte della logica applicativa nel database (più affidabile e veloce);
  • Controllare automaticamente le condizioni durante l'inserimento, l'aggiornamento o la cancellazione.

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.

Esempio:

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 );

Domanda ingannevole

"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.

Esempio:
CREATE TABLE test ( id INT PRIMARY KEY, code VARCHAR(10) UNIQUE ); INSERT INTO test (id, code) VALUES (1, NULL), (2, NULL); -- passerà

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze del tema


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.