High severitydata format
PostgreSQL Error:
23502
What does this error mean?
PostgreSQL gooit error 23502 wanneer een INSERT of UPDATE probeert een NULL-waarde op te slaan in een kolom met een NOT NULL constraint. In een data-pipeline betekent dit vrijwel altijd dat een bron-record een verplicht veld mist, dat een transformatie een waarde op NULL heeft gezet, of dat een schema-wijziging een constraint heeft toegevoegd zonder backfill. De pipeline-run stopt abrupt: het betreffende batch-record wordt niet geschreven en afhankelijke tabellen blijven stale. De foutmelding noemt expliciet de kolomnaam, wat diagnosering eenvoudig maakt — het zoeken naar de oorzaak in de brondata of transformatielogica is de echte uitdaging.
Common causes
- 1Brondata bevat lege waarden voor verplichte velden: een upstream systeem exporteert soms NULL voor kolommen als `customer_id` of `event_timestamp` bij gedeeltelijk gevulde records. Dit gebeurt met name bij soft-deletes of half-voltooide transacties.
- 2ETL-transformatie produceert onverwacht NULL: een JOIN met LEFT JOIN op een lookup-tabel geeft NULL terug voor niet-matchende rijen. Als die uitkomst rechtstreeks in een NOT NULL kolom wordt geschreven, faalt elke rij zonder match.
- 3Schema-migratie zonder default of backfill: `ALTER TABLE orders ADD COLUMN region VARCHAR NOT NULL;` faalt als bestaande rijen geen waarde krijgen, maar ook nieuwe inserts falen als de ETL de kolom nog niet aanlevert.
- 4dbt-model met COALESCE weggeoptimaliseerd of refactored: iemand hernoemt een bronkolom in een staging-model maar vergeet de COALESCE in het downstream model. De kolom valt terug op NULL.
- 5ADF copy-activity zonder kolomtoewijzing: bij schema-drift in de bron past Azure Data Factory de kolom-mapping niet automatisch aan. Een nieuwe NULL-kolom in de bron wordt doorgegeven aan een NOT NULL doelkolom.
- 6Incrementele laadstrategie laadt delta-records met incomplete velden: de eerste volledige load werkte, maar delta-records bevatten geen waarde voor kolommen die in de full-load altijd aanwezig waren.
- 7Parallel inserts vanuit meerdere pipeline-threads: bij race conditions kan een record tussentijds een NULL-status krijgen als twee processen dezelfde rij bewerken zonder adequate locking.
How to fix it
- 1Stap 1 — Lees de exacte kolomnaam uit de foutmelding: `ERROR: null value in column "region" of relation "orders" violates not-null constraint`. Noteer tabel én kolom.
- 2Stap 2 — Zoek welke rijen NULL bevatten in de bron: `SELECT COUNT(*) FROM staging.orders WHERE region IS NULL;` — geeft direct de omvang van het probleem.
- 3Stap 3 — Voeg COALESCE toe in de transformatie of dbt-model: `COALESCE(source.region, 'unknown')` of zet een default in het dbt-schema: `- name: region\n tests:\n - not_null`. Zo vangt het model het op vóór het naar de doeltabel schrijft.
- 4Stap 4 — Voeg een NOT NULL-test toe in dbt vóór het laden: in `schema.yml` onder het model `- name: region\n tests:\n - not_null`. Dit laat dbt de pipeline stoppen vóór het schrijven, met een leesbare fout.
- 5Stap 5 — Als de constraint tijdelijk te strikt is, dropt u hem: `ALTER TABLE orders ALTER COLUMN region DROP NOT NULL;` — doe dit alleen als de NULL semantisch geldig is en voeg later een DEFAULT toe: `ALTER TABLE orders ALTER COLUMN region SET DEFAULT 'unknown';`
- 6Stap 6 — Controleer ADF-kolomtoewijzing in de Copy Data activity: open de activiteit → Mapping → schakel 'Import schemas' opnieuw in en verifieer dat elke NOT NULL doelkolom een expliciete bronkolom heeft.
- 7Stap 7 — Voeg upstream data-kwaliteitscheck toe: run vóór het laden `SELECT * FROM staging.orders WHERE region IS NULL LIMIT 10;` en laat de pipeline falen met een informatieve melding als er NULL-rijen zijn, in plaats van pas te falen bij de insert.
Example log output
ERROR: null value in column "region" of relation "orders" violates not-null constraint
DETAIL: Failing row contains (10482, 2026-05-11, NULL, 149.99, completed).
CONTEXT: COPY orders, line 1: "10482 2026-05-11 \N 149.99 completed"