Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 错误:“重复键值违反唯一约束”,即使在检查“where not in”时也是如此_Sql_Postgresql_Subquery_Inner Join_Sql Insert - Fatal编程技术网

Sql 错误:“重复键值违反唯一约束”,即使在检查“where not in”时也是如此

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 上面的代码返回

即使在检查主键是否已在我要插入的表中时,也会出现错误:“重复键值违反唯一约束”

我试着用“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
上面的代码返回错误:“重复键值违反唯一约束”,即使由于检查主键是否已插入表中而不可能出现这样的错误

编辑:
该表只有一个唯一约束是主键,在上面称为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)。除非我们努力清晰地重新书写,否则我们无法推理、沟通或搜索。可能重复