A volte non abbiamo voglia di compilare tutti i campi a mano — sì, siamo pigri o magari ci mancano proprio i dati. In questi casi puoi impostare dei valori di default in anticipo, così il database li mette da solo quando serve.
Inserimento di righe nella tabella
Valori di default sono super collegati all'inserimento di righe in una tabella. Quindi ora te ne parlo al volo, poi tra qualche lezione ci torniamo sopra e la vediamo meglio.
Aggiungere righe a una tabella è facilissimo - c'è il comando speciale INSERT INTO. INSERT INTO è un'istruzione SQL che aggiunge nuove righe nella tabella. È una delle più usate, soprattutto quando lavori con web form, log, registrazione utenti e aggiornamento dati.
Sintassi del comando
INSERT INTO tabella (colonna1, colonna2, ...)
VALUES (valore1, valore2, ...);
Spiegazione:
tabella— nome della tabella dove aggiungi i dati.colonna1,colonna2, ... — elenco delle colonne (puoi anche non scriverle se dai i valori in tutte le colonne e nell'ordine giusto).valore1,valore2, ... — valori che corrispondono alle colonne elencate.
Esempio semplice
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');
Aggiunge una riga nella tabella users: nome — "Alice", email — "alice@example.com".
Risultato:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
Inserire più righe in una volta
Puoi anche inserire più record in una sola query — è più veloce e risparmi risorse.
INSERT INTO users (name, email)
VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.net'),
('Charlie', 'charlie@example.org'),
('Diana', 'diana@example.com'),
('Eve', 'eve@example.net');
Ecco il risultato:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
| 3 | Charlie | charlie@example.org |
| 4 | Diana | diana@example.com |
| 5 | Eve | eve@example.net |
Valore di default
Ti ricordi la sintassi per aggiungere righe?
INSERT INTO tabella (colonna1, colonna2, ...)
VALUES (valore1, valore2, ...);
Secondo te, perché c'è la lista delle colonne: colonna1, colonna2? Non potresti semplicemente mettere i valori nello stesso ordine delle colonne della tabella?
Il punto è che un sacco di valori puoi anche non specificarli quando aggiungi dati. Per esempio, l'ID della nuova riga PostgreSQL lo calcola da solo quando inserisci. Può anche calcolare da solo la data/ora corrente e metterla nella colonna giusta. Se non passi certi dati, PostgreSQL li mette a NULL.
PostgreSQL può fare un sacco di cose utili per te. E tu puoi controllare questo processo — per questo esistono i valori di default, che imposti con la parola chiave DEFAULT.
Il valore di default viene usato se quando aggiungi un record non dai un valore per una colonna specifica. Questo ti fa risparmiare tempo e previene errori tipo dimenticare un valore importante.
Come funziona DEFAULT?
Vediamo la sintassi. I valori di default si impostano quando crei la tabella. Ecco il formato generale:
CREATE TABLE tabella (
colonna tipo_dato DEFAULT valore_default
);
Oppure, se vuoi aggiungere un valore di default a una tabella già esistente:
ALTER TABLE tabella
ALTER COLUMN colonna
SET DEFAULT valore_default;
Ti spiego meglio come cambiare le tabelle tra qualche lezione :P
Esempio 1: Tabella con campo DEFAULT
Creiamo la tabella students, dove ogni studente riceve automaticamente la data di registrazione:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
registration_date DATE DEFAULT CURRENT_DATE
);
Ora, quando aggiungi uno studente senza specificare registration_date, PostgreSQL riempie il campo con la data di oggi.
INSERT INTO students (name) VALUES ('Alex Lin');
Se fai una query:
SELECT * FROM students;
Ottieni questo risultato:
| id | name | registration_date |
|---|---|---|
| 1 | Alex Lin | 2023-10-15 |
Esempi pratici
Valore di default per una colonna numerica
Supponiamo di avere la tabella grades, dove la colonna grade deve avere valore di default 0 se il voto non è ancora stato assegnato.
CREATE TABLE grades (
id SERIAL PRIMARY KEY,
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
grade INTEGER DEFAULT 0
);
Aggiungiamo un record senza specificare grade:
INSERT INTO grades (student_id, course_id) VALUES (1, 101);
Ora la tabella sarà così:
| id | student_id | course_id | grade |
|---|---|---|---|
| 1 | 1 | 101 | 0 |
Uso di TEXT con valore di default
Immagina la tabella teachers, dove ogni insegnante riceve automaticamente lo status "non verificato" quando viene aggiunto.
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
status TEXT DEFAULT 'non verificato'
);
Aggiungiamo un insegnante senza specificare lo status:
INSERT INTO teachers (name) VALUES ('Peter Pall');
Risultato:
| id | name | status |
|---|---|---|
| 1 | Peter Pall | non verificato |
Valori di default per l'orario
Per la tabella meetings, dove salviamo i dati degli incontri, puoi impostare il campo meeting_time con l'orario standard di inizio: 10:00 di mattina.
CREATE TABLE meetings (
id SERIAL PRIMARY KEY,
topic VARCHAR(100),
meeting_time TIME DEFAULT '10:00'
);
Aggiungiamo un record:
INSERT INTO meetings (topic) VALUES ('Discussione progetto');
Risultato:
| id | topic | meeting_time |
|---|---|---|
| 1 | Discussione progetto | 10:00 |
Errori tipici usando DEFAULT
Tipo di dato del valore di default non corrispondente. Se provi a mettere un valore testuale in una colonna numerica, PostgreSQL si lamenta:
CREATE TABLE example (
number INTEGER DEFAULT 'testo'
);
Errore:
invalid input syntax for type integer.
Modificare DEFAULT senza pensare ai record già esistenti. Quando cambi il valore di default, non cambia i record già inseriti — quelli restano come prima. Se vuoi aggiornare le righe già presenti, usa UPDATE.
UPDATE students SET registration_date = '2023-01-01' WHERE registration_date IS NULL;
Confusione tra DEFAULT e NOT NULL. Il valore di default non significa che il campo diventa obbligatorio (NOT NULL). Se non scrivi NOT NULL esplicitamente, la colonna può comunque essere NULL.
GO TO FULL VERSION