DBAtlas · 数据库运维图谱

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 也这样做,以免静默产生错误结果。要找出意外的多重匹配,单独运行子查询并检查行数。

在 DBAtlas 中打开 →

同一数据库的其他条目