Sql 错误:“重复键值违反唯一约束”,即使在检查“where not in”时也是如此
即使在检查主键是否已在我要插入的表中时,也会出现错误:“重复键值违反唯一约束” 我试着用“where not y.a in…”和“where not exists…”两个词进行检查 我现在使用的代码如下:Sql 错误:“重复键值违反唯一约束”,即使在检查“where not in”时也是如此,sql,postgresql,subquery,inner-join,sql-insert,Sql,Postgresql,Subquery,Inner Join,Sql Insert,即使在检查主键是否已在我要插入的表中时,也会出现错误:“重复键值违反唯一约束” 我试着用“where not y.a in…”和“where not exists…”两个词进行检查 我现在使用的代码如下: INSERT INTO db1.x (a,b,c,d) SELECT y.a, y.b, y.c, z.p FROM db2.y, db2.z WHERE NOT y.a IN (SELECT x.a FROM db1.x) AND y.a = z.a 上面的代码返回
INSERT INTO db1.x (a,b,c,d)
SELECT y.a, y.b, y.c, z.p
FROM db2.y, db2.z
WHERE
NOT y.a IN (SELECT x.a FROM db1.x)
AND y.a = z.a
上面的代码返回错误:“重复键值违反唯一约束”,即使由于检查主键是否已插入表中而不可能出现这样的错误
编辑:
该表只有一个唯一约束是主键,在上面称为x.a的代码中,错误消息非常清楚:无法插入,因为它违反了表中定义的唯一约束 由于您已经在检查主键上的DUP,因此很可能您的表设置了另一个唯一约束,从而禁止插入操作。这无法确定,因为您没有共享表的定义 您可以在插入之前更改查询以检查该约束 另一个选择是使用便利的Postgres为您完成工作。从文件中: optional ON CONFLICT子句指定引发唯一冲突或排除约束冲突错误的替代操作。[…]关于冲突,什么都不做只是避免插入一行作为其替代操作 考虑这个更简单的查询:
INSERT INTO db1.x (a,b,c,d)
SELECT y.a, y.b, y.c, z.p FROM db2.y INNER JOIN db2.z ON y.a = z.a
ON CONFLICT DO NOTHING;
注意:隐式连接很久以前就不受欢迎了,尽管它是完美的函数,但它们往往使te查询更难理解;我修改了查询的这一部分以使用显式联接。请共享表的定义。很可能是主键之外的另一个唯一约束导致了失败。您可能希望使用内部连接,而不是db2.y、db2.z和Where子句,我认为这样会更好。。。其中y.a不在Select中…是否可能有来自子查询的空值?这是常见问题解答。在考虑发帖之前,请始终用谷歌搜索你的错误消息或你的问题/问题/目标的许多清晰、简洁和准确的措辞,有/没有你的特定字符串/名称和网站:stackoverflow.com和标签,并阅读许多答案。如果你发布一个问题,用一句话作为标题。请参见文本上方的投票箭头(&S)。除非我们努力清晰地重新书写,否则我们无法推理、沟通或搜索。可能重复