MetricSign
Start free
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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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';`
  6. 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.
  7. 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"

Frequently asked questions

Hoe fix ik 23502 in een dbt-model?

Voeg een `not_null`-test toe in schema.yml zodat dbt de fout onderschept vóór het laden. Voeg in het model zelf `COALESCE(kolom, 'default')` toe. Run `dbt test --select jouw_model` om te verifiëren dat de test slaagt vóór je de fix deployt.

Kan ik 23502 automatisch laten retrien in ADF?

Retry helpt niet bij 23502 — de data is structureel onjuist, niet tijdelijk onbeschikbaar. Voeg in plaats daarvan een Lookup-activiteit vóór de Copy toe die NULL-rijen filtert, of stuur ze naar een quarantine-tabel voor handmatige review. Een retry zou alleen dezelfde fout opleveren.

Wat is het verschil tussen 23502 en 23505 in PostgreSQL?

23502 is een not-null violation: een verplicht veld ontbreekt. 23505 is een unique violation: een waarde bestaat al. Beide stoppen een insert, maar 23502 wijst op ontbrekende data terwijl 23505 op duplicaten wijst. Check de SQLSTATE in de foutmelding om ze te onderscheiden.

Hoe voorkom ik 23502 bij een schema-migratie die een NOT NULL kolom toevoegt?

Voer de migratie in twee stappen uit: (1) voeg de kolom toe als nullable — `ALTER TABLE t ADD COLUMN c VARCHAR;` — en backfill bestaande rijen: `UPDATE t SET c = 'default' WHERE c IS NULL;`. (2) Voeg daarna de NOT NULL constraint toe: `ALTER TABLE t ALTER COLUMN c SET NOT NULL;`. Zo falen bestaande én nieuwe inserts niet tijdens de migratie.

Source · www.postgresql.org/docs/current/errcodes-appendix.html

Other data format errors