Cardinality Violation — SQLSTATE 21000
SQLSTATE 21000 condition cardinality_violation class 21 — Cardinality Violation severity ERROR
Reproduced & verified on PostgreSQL 14.23, 15.18, 16.14, 17.10 and 18.4 — identical message on every version.
Last reviewed 29 May 2025 · Reproduced live with the SQL on this page.
! Symptoms Free
A scalar context received more than one row.
- The error is written to the server log and returned to the client carrying
SQLSTATE 21000. - Any driver (libpq, JDBC, psycopg, npgsql, pgx) surfaces this code in its error object so you can branch on it programmatically.
- PL/pgSQL can trap it by name:
EXCEPTION WHEN cardinality_violation THEN.
1 Environment & reproduce Free
Severity: ERROR | PostgreSQL versions: 12, 13, 14, 15, 16, 17
Reproduce with the exact statement and read the full message in the server log (raise log_min_messages / set log_min_error_statement for more context).
? Root cause Free
A subquery used where a single value is required returned multiple rows, or a multi-row update target was ambiguous.
Common causes:
- A scalar subquery returning more than one row.
SELECT INTOmatching multiple rows.- An UPDATE ... FROM join producing several source matches per target row.
3 Recovery & verify Free
Steps to resolve 21000:
- Add
LIMIT 1with a deterministicORDER BY, or aggregate the subquery. - Make join keys unique so each target row matches at most one source row.
- In PL/pgSQL use
SELECT ... INTO STRICTonly when exactly one row is guaranteed.
Reference: PostgreSQL error codes — Class 21 (Cardinality Violation).