PostgreSQL-Fehler: 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).
Der Schreibvorgang hätte eine NOT-NULL-Spalte leer gelassen, daher hat PostgreSQL ihn abgewiesen. Die DETAIL-Zeile zeigt die gesamte fehlschlagende Zeile mit Werten in der Spaltenreihenfolge der Tabelle — richten Sie sie an der \d-Ausgabe aus und Sie sehen genau, was ankam.
Was dieser Fehler bedeutet
Ein Mechanismus hier überrascht fast jeden irgendwann: Spalten-Defaults greifen nur, wenn die Spalte aus dem INSERT weggelassen wird (oder ihr explizit das Schlüsselwort DEFAULT gegeben wird). Ein INSERT, das die Spalte auflistet und NULL übergibt, bedeutet NULL — der Default springt nicht ein. ORMs, die jedes gemappte Feld serialisieren und null für nicht gesetzte senden, deaktivieren Ihre Datenbank-Defaults auf diese Weise stillschweigend.
Häufige Ursachen
- INSERT, das eine erforderliche Spalte weglässt, die keinen Default hat.
- Explizites NULL aus der Anwendung (das obige ORM-Muster), das einen bestehenden DEFAULT überschreibt.
- UPDATE, das die Spalte auf NULL setzt, direkt oder über eine Berechnung, die NULL ergab.
- Datenladevorgänge: in
COPY ... CSVwird ein ungequotetes leeres Feld als NULL gelesen (ein gequoteter leerer String""nicht).
So diagnostizieren Sie ihn
\d users -- welche Spalten sind NOT NULL, welche haben einen DEFAULT
Ordnen Sie die DETAIL-Zeile der Spaltenliste zu, um das anstößige Feld zu identifizieren, und finden Sie dann, wer das NULL erzeugt hat: Anwendungs-Payload, ORM-Serialisierung oder die Eingabedatei. Das tatsächliche SQL zu protokollieren, das die App sendet, klärt die "aber wir haben doch einen Default gesetzt!"-Gespräche schnell.
So beheben Sie ihn
- Liefern Sie den Wert, oder fügen Sie einen echten Default hinzu:
ALTER TABLE users ALTER COLUMN created_at SET DEFAULT now(); - ORM, das NULLs sendet → konfigurieren Sie es so, dass es nicht gesetzte Spalten weglässt, oder setzen Sie den Default sowohl im Modell als auch in der Datenbank.
- CSV-Ladevorgänge → steuern Sie die NULL-Behandlung explizit (Option
NULL '', oder bereinigen Sie die Datei); laden Sie in Zweifelsfällen in eine Staging-Tabelle. - Wenn NULL für das Geschäft tatsächlich legitim ist, entfernen Sie den Constraint bewusst:
ALTER TABLE users ALTER COLUMN email DROP NOT NULL;— eine Entscheidung, kein Workaround.
