null value error failed not null constraint violated on insert
The insert is being rejected row by row, so find the offending rows before changing the constraint: run the load in a transaction or staging pass that captures the rows with nulls in the constrained column, trace them to the source or the transform that produced them, and fix the production of those rows. Use when an insert or load failing on a not null constraint. Not for a null-rate spike measured after loads.
TL;DR
The insert is being rejected row by row, so find the offending rows before changing the constraint: run the load in a transaction or staging pass that captures the rows with nulls in the constrained column, trace them to the source or the transform that produced them, and fix the production of those rows. Dropping the constraint trades a loud failure for silent bad data.
null value error failed not null constraint violated on insertUse this when
- The check or run fails with this symptom: the database rejects inserts because a required column contains null.
- You are working on an insert or load failing on a not null constraint and the failure repeats on the same data or configuration.
- You need the failing rows, rule, or stage isolated before changing thresholds or code.
Not for this skill when
- A null-rate spike measured after loads succeed, which is a monitoring problem rather than a rejected insert instead.
- The error text names a different tool, stage, or root cause. Match the verbatim error first and use that skill.
Steps
- Reproduce the load against a staging copy with row-level error capture and list the rejected rows' keys. Verify: the rejected rows are captured with their keys
- Trace one rejected row to its source record and the transform steps that produced the null. Verify: the producing step for the null is identified
- Check for the usual producers: a left join that missed, a case expression with no else branch, or a source record type that lacks the field. Verify: the producer pattern is confirmed across the rejected set
- Fix the producer or add an explicit, documented default at the transform layer, and quarantine rows that cannot be fixed. Verify: fixed rows load and unfixable rows are quarantined with reasons
- Rerun the full load and confirm the constraint holds with zero rejections. Verify: the load completes with no constraint violations
Variant phrasings
not null constraint violated on insert
The verbatim constraint phrasing.
insert failed null value in column warehouse load
The load phrasing for bulk inserts rejected on nulls.
how to find rows causing not null violation
The row-finding phrasing for staging captures.
Compatibility: Postgres, Snowflake, BigQuery, and MySQL inserts with NOT NULL constraints
Why it happens
NOT NULL constraints enforce the contract at write time, so any upstream path that can emit a null, including outer joins, incomplete case logic, and new source record types, turns into a load failure. The database message names the column but not the path that produced the null.
Edge cases / pitfalls
- Load through staging with the same constraints as the target so violations are caught before the production write.
- Count quarantined rows per run and alert on growth. A quarantine that grows silently becomes the real table.
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_e4qUpRUWRAR4Gj8hScs9tQ