CodeGym /Corsi /SQL SELF /Inserimento dati in tabelle con vincoli: NOT NULL<...

Inserimento dati in tabelle con vincoli: NOT NULL, DEFAULT

SQL SELF
Livello 21, Lezione 1
Disponibile

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.

2
Compito
SQL SELF, livello 21, lezione 1
Bloccato
Uso combinato di `NOT NULL` e `DEFAULT`
Uso combinato di `NOT NULL` e `DEFAULT`
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION