Errore PostgreSQL: null value violates not-null constraint
ERROR: null value in column "email" of relation "users" violates not-null constraint
DETAIL: Failing row contains (42, null, Alice, 2026-07-09 10:12:00).
La scrittura avrebbe lasciato vuota una colonna NOT NULL, quindi PostgreSQL l'ha rifiutata. La riga DETAIL mostra l'intera riga fallita, con i valori nell'ordine delle colonne della tabella — allineala con l'output di \d e vedi esattamente cosa è arrivato.
Cosa significa questo errore
Un meccanismo qui sorprende quasi tutti prima o poi: i default delle colonne si applicano solo quando la colonna è omessa dall'INSERT (o le viene dato esplicitamente la keyword DEFAULT). Un INSERT che elenca la colonna e passa NULL significa NULL — il default non entra in gioco. Gli ORM che serializzano ogni campo mappato, inviando null per quelli non impostati, disabilitano silenziosamente i tuoi default del database in questo modo.
Cause comuni
- INSERT che omette una colonna obbligatoria senza default.
- NULL esplicito dall'applicazione (il pattern ORM di cui sopra) che sovrascrive un DEFAULT esistente.
- UPDATE che imposta la colonna a NULL, direttamente o via un calcolo che ha prodotto NULL.
- Caricamenti di dati: in
COPY ... CSV, un campo vuoto non quotato viene letto come NULL (una stringa vuota quotata""non lo è).
Come diagnosticarlo
\d users -- quali colonne sono NOT NULL, quali hanno un DEFAULT
Mappa la riga DETAIL sull'elenco delle colonne per identificare il campo colpevole, poi trova chi ha prodotto il NULL: payload applicativo, serializzazione dell'ORM, o il file di input. Loggare l'SQL effettivo che l'app invia risolve in fretta le conversazioni "ma abbiamo impostato un default!".
Come risolverlo
- Fornisci il valore, o aggiungi un default genuino:
ALTER TABLE users ALTER COLUMN created_at SET DEFAULT now(); - ORM che invia NULL → configuralo per omettere le colonne non impostate, o imposta il default nel modello oltre che nel database.
- Caricamenti CSV → controlla la gestione del NULL esplicitamente (opzione
NULL '', o pulisci il file); carica in una tabella di staging in caso di dubbio. - Se il NULL è davvero legittimo per il business, rimuovi il vincolo deliberatamente:
ALTER TABLE users ALTER COLUMN email DROP NOT NULL;— una decisione, non un workaround.
