21000: cardinality_violation
PostgreSQL意味
1 行が想定される箇所で複数行が返された。スカラーサブクエリが複数行を返した、または MERGE/ON CONFLICT DO UPDATE が同じ対象行に 2 回目の変更を試みた。Class 21 に属する。
原因
SELECT リストや WHERE = (subquery) の形式で使用したサブクエリが複数行を返す、単一の INSERT ... ON CONFLICT DO UPDATE で同じ競合キーが複数回提示される ('cannot affect row a second time')、または MERGE で複数のソース行が 1 つの対象行に一致する。UPDATE ... FROM は複数一致でエラーにならず、対象行はソース行のいずれか 1 行から予測不能に更新される。
対処方法
サブクエリが 1 行を返すようにする: LIMIT 1 を追加する、集約 (MAX/MIN) を使用する、または一致を一意にする条件を与える。MERGE と ON CONFLICT のパターンではソース側を DISTINCT ON/集約で重複排除し、UPDATE ... FROM でも同様にして暗黙の誤った結果を防ぐ。想定外の複数一致を見つけるには、サブクエリを単独で実行して行数を確認する。