21000: cardinality_violation
PostgreSQL含义
在期望单行的地方返回了多行。标量子查询返回了多行,或 MERGE/ON CONFLICT DO UPDATE 试图第二次影响同一目标行。属于 Class 21。
原因
在 SELECT 列表中或以 WHERE = (subquery) 形式使用的子查询返回了多行;在单条 INSERT ... ON CONFLICT DO UPDATE 中同一冲突键被提出多次('cannot affect row a second time');或在 MERGE 中多个源行匹配同一目标行。UPDATE ... FROM 在多重匹配时不会报错;目标行只会以不可预测的方式由其中一个源行更新。
解决方法
确保子查询只返回一行:添加 LIMIT 1、使用聚合函数(MAX/MIN),或提供使匹配唯一的条件。在 MERGE 和 ON CONFLICT 模式中,用 DISTINCT ON/聚合对源端去重;对 UPDATE ... FROM 也这样做,以免静默产生错误结果。要找出意外的多重匹配,单独运行子查询并检查行数。