Oggi vediamo nel dettaglio un altro aspetto importante del lavoro con i database — come inserire dati in tabelle che hanno i vincoli NOT NULL e DEFAULT. A questo punto dovresti già conoscere la sintassi base del comando INSERT INTO e capire come aggiungere righe in tabelle con una certa struttura. Ora è il momento di approfondire — perché lavorare con i vincoli spesso fa venire il mal di testa agli sviluppatori. Ma tranquillo, alla fine della lezione saprai gestire questi meccanismi senza problemi!
Cosa sono i vincoli?
I vincoli sono regole che vengono applicate alle colonne di una tabella. Servono a mantenere i dati in una forma logicamente corretta. Per esempio, non puoi lasciare vuoto un campo che deve per forza avere un valore (NOT NULL), oppure puoi non specificare un valore per una colonna se c'è già un valore di default (DEFAULT).
Tipi di vincoli: - NOT NULL — indica che la colonna non può contenere NULL. - DEFAULT — imposta un valore che verrà inserito automaticamente nella colonna se non lo specifichi.
I vincoli aiutano a mantenere l'integrità dei dati. Immagina di avere una tabella students con la lista degli studenti, e una delle regole è che ogni studente deve avere per forza un nome (NOT NULL). Senza questo vincolo, qualcuno potrebbe dimenticare di inserire il nome e ti ritroveresti con uno "studente senza nome" nel database. Oppure, altro esempio: decidi che il valore standard per i crediti di un nuovo corso è 0 (DEFAULT), così non devi pensarci ogni volta.
Lavorare con il vincolo NOT NULL
Il vincolo NOT NULL ti obbliga a specificare un valore in una certa colonna quando aggiungi una riga. Se provi a inserire NULL in quella colonna o non la specifichi proprio, il database "si arrabbia" (ti dà errore). Vediamo un esempio.
Creiamo una tabella semplice students:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL, -- Il nome non può essere vuoto
age INT
);
Nota: la colonna name ha il vincolo NOT NULL, mentre la colonna age non ha vincoli.
Esempio di inserimento dati con NOT NULL
Ora proviamo ad aggiungere degli studenti:
-- Esempio di inserimento riuscito
INSERT INTO students (name, age) VALUES ('Alice', 23);
-- Successo: il nome è specificato, il campo rispetta il vincolo NOT NULL
-- Esempio di errore:
INSERT INTO students (age) VALUES (30);
-- Errore: il campo name non può essere NULL, perché ha il vincolo NOT NULL
Quando ricevi un errore tipo null value in column "name" violates not-null constraint, non spaventarti — è solo PostgreSQL che ti ricorda di stare attento.
Usare i valori di default (DEFAULT)
Il vincolo DEFAULT dice al database: "Se ti dimentichi di specificare un valore per questa colonna, usa questo valore qui". Questo rende la vita più facile agli sviluppatori, perché non devi compilare ogni campo a mano.
Esempio di tabella con vincolo DEFAULT
Creiamo la tabella courses:
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
credits INT DEFAULT 0 -- Valore di default per la colonna credits — 0
);
Esempio di inserimento dati con DEFAULT
Ora proviamo ad aggiungere dei corsi:
-- Abbiamo specificato esplicitamente il valore per credits
INSERT INTO courses (name, credits) VALUES ('Mathematics', 5);
-- Non abbiamo specificato credits — verrà usato il valore di default (0)
INSERT INTO courses (name) VALUES ('History');
-- Vediamo cosa è successo
SELECT * FROM courses;
Risultato:
| id | name | credits |
|---|---|---|
| 1 | Mathematics | 5 |
| 2 | History | 0 |
Nota: quando abbiamo aggiunto il corso History non abbiamo specificato il numero di crediti. PostgreSQL ha riempito automaticamente la colonna credits con il valore 0.
Usare insieme i vincoli NOT NULL e DEFAULT
Queste colonne richiedono un valore, anche se non lo specifichi tu. Per esempio, nella tabella courses la colonna credits può avere sia DEFAULT che NOT NULL, così sei sicuro che nessuno la lasci vuota per sbaglio (NULL).
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
credits INT NOT NULL DEFAULT 0
);
Esempio di inserimento dati
Immagina che ogni nuovo corso debba avere di default 0 crediti, ma NULL non è ammesso.
-- Ok: credits prende il valore di default
INSERT INTO courses (name) VALUES ('Physics');
-- Errore: tentativo di inserire NULL in una colonna con NOT NULL
INSERT INTO courses (name, credits) VALUES ('Chemistry', NULL);
Esempio: Aggiunta di uno studente con nome obbligatorio
Creiamo la tabella students con i vincoli:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL, -- Il nome è obbligatorio
enrollment_date DATE DEFAULT CURRENT_DATE -- Data di iscrizione di default — oggi
);
Ora aggiungiamo degli studenti:
-- Il nome è specificato, la data di iscrizione verrà inserita automaticamente
INSERT INTO students (name) VALUES ('Bob');
-- Proviamo a non specificare il nome (otterremo un errore)
INSERT INTO students (enrollment_date) VALUES ('2024-10-01');
Un ottimo esempio di come PostgreSQL ti aiuta a garantire la correttezza dei dati: tutti gli studenti hanno per forza un nome, mentre la data di iscrizione non serve specificarla sempre.
Consigli e "trappole"
Quando lavori con i vincoli NOT NULL e DEFAULT, tieni a mente alcune cose importanti. Per esempio, se nei tuoi dati capita spesso NULL, il vincolo NOT NULL può diventare un vero incubo. E se imposti un valore di default per tutte le colonne, rischi di avere dati non corretti (tipo 0 invece del valore reale).
Di solito, se aggiungi una nuova colonna a una tabella esistente, le celle per le righe già presenti vengono riempite con NULL. Però, se specifichi DEFAULT X, tutta la colonna verrà riempita con il valore X. Questa cosa è super comoda e aiuta a mantenere l'integrità del database.
Per esempio, una nuova colonna è una FOREIGN KEY su una tabella esistente. E non può contenere NULL o 0. Deve riferirsi a righe già esistenti della tabella collegata.
Cosa fare se ti sei dimenticato di aggiungere i vincoli?
Tranquillo — puoi sempre aggiungere i vincoli dopo usando il comando ALTER TABLE. Per esempio:
-- Aggiungiamo il vincolo DEFAULT a una colonna esistente
ALTER TABLE courses ALTER COLUMN credits SET DEFAULT 0;
-- Aggiungiamo il vincolo NOT NULL a una colonna esistente
ALTER TABLE students ALTER COLUMN name SET NOT NULL;
Queste query non rompono i dati già presenti — puoi usarle su tabelle che hanno già qualcosa di importante dentro.
Ora sei pronto a sfruttare la potenza di PostgreSQL per gestire i vincoli! I tuoi dati saranno più strutturati e protetti dagli errori, e le query — logiche e prevedibili.
GO TO FULL VERSION