Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
为什么在没有重复的情况下,我的postgresql insert语句中会出现重复的主键错误?_Postgresql_Duplicates_Primary Key - Fatal编程技术网

为什么在没有重复的情况下,我的postgresql insert语句中会出现重复的主键错误?

为什么在没有重复的情况下,我的postgresql insert语句中会出现重复的主键错误?,postgresql,duplicates,primary-key,Postgresql,Duplicates,Primary Key,注意:在阅读了一些评论之后,我将我的查询更新为以下内容,这是有效的。但也许有一个更简洁的解决方案。 这似乎起到了作用 insert into duplicates(contact_id_a, contact_id_b, ignore_duplicate, has_been_fetched, list_id, contact_a_name, contact_b_name) SELECT 32753, 42260, false, false, 567, (select data->>'

注意:在阅读了一些评论之后,我将我的查询更新为以下内容,这是有效的。但也许有一个更简洁的解决方案。 这似乎起到了作用

insert into duplicates(contact_id_a, contact_id_b, ignore_duplicate, has_been_fetched, list_id, contact_a_name, contact_b_name) 
SELECT 32753, 42260, false, false, 567, (select data->>'firstname' as ca_firstname from contacts where contact_id = 32753),
(select data->>'firstname' as cb_firstname from contacts where contact_id = 42260) 
WHERE NOT EXISTS ( SELECT * FROM duplicates WHERE list_id = 567  
                  AND ((contact_id_a = 32753 and contact_id_b = 42260) OR (contact_id_a = 42260 and contact_id_b = 32753) ));
为什么我的postgresql查询在没有重复主键的情况下引发此重复主键错误

ERROR:  duplicate key value violates unique constraint "duplicates_pkey"
DETAIL:  Key (contact_id_a, contact_id_b, list_id)=(32753, 42260, 567) already exists.
SQL state: 23505
duplicates表是空的,因此我认为新行是唯一的

这是问题所在。很清楚我在做什么,但简而言之,只有在duplicates表中还没有包含指定联系人id和列表id的行时,才会在duplicates表中插入一个新行,该行包含第二个名为contacts的表中的姓名信息

insert into duplicates(contact_id_a, contact_id_b, ignore_duplicate, has_been_fetched, list_id, contact_a_name, contact_b_name) 
SELECT 32753, 42260, false, false, 567, ca.data->>'firstname', cb.data->>'firstname'
from contacts c 
left join contacts ca on ca.list_id=567 and ca.contact_id = 32753 
left join contacts cb on cb.list_id=567 and cb.contact_id = 42260 
WHERE NOT EXISTS ( SELECT * FROM duplicates WHERE list_id = 567  
                  AND ((contact_id_a = 32753 and contact_id_b = 42260) OR (contact_id_a = 42260 and contact_id_b = 32753) ));
这是我的主键约束。。。

在执行任何操作之前,请尝试转储数据库,以便在出现任何问题时返回到当前状态,然后尝试重新索引数据库:

REINDEX数据库

真空也可能是一个好主意:
真空,分析,冗长

在执行任何操作之前,请尝试转储数据库,以便在出现任何问题时返回到当前状态,然后尝试重新索引数据库:

REINDEX数据库

真空也可能是一个好主意: 真空,分析,冗长

select使用相同的键组合返回多行

您需要修复select查询,使其每个键组合只返回一行

您可能可以使用distinct:

select使用相同的键组合返回多行

您需要修复select查询,使其每个键组合只返回一行

您可能可以使用distinct:


请运行insert的查询部分,并在此处记录返回的行数。您的查询本身在contact\u id\u a、contact\u id\u b、list\u id上返回重复项。太多。谢谢你的提示。现在我看到我一直在从contacts表中提取每一行,而实际上我只需要包含指定contact_id的行中的数据。我更新了select查询,如下所示,现在返回两行-两个指定的联系人ID各一行。不过,正如您所暗示的,select语句必须只返回一行。我们只需要整个查询在duplicates表中插入一行,其中包含一些硬编码的值和contacts表中的name值。也许我根本不应该使用连接,而是使用嵌套语句。选择32753、42260、false、false、567、ca.data->“firstname”,cb.data->“firstname”从联系人c左连接ca.list_id=567上的联系人ca和ca.contact_id=32753左连接cb上的联系人cb。list_id=567和cb.contact_id=42260,其中c.contact_id在32753中,42260我找到了一个最有效的解决方案。现在我如何扩展它来管理cb_firstname呢?插入副本联系人id a、联系人id b、忽略副本、已提取、列表id、联系人姓名选择32753、42260、false、false、567、,ca_firstname from select data->>“firstname”作为ca_firstname from contacts_id=32753 as c(不存在)从列表_id=567和联系人_id_a=32753和联系人_id_b=42260或联系人_id_a=42260和联系人_id_b=32753的副本中选择*;请运行insert的查询部分,并在此处记录返回的行数。您的查询本身在contact\u id\u a、contact\u id\u b、list\u id上返回重复项。太多。谢谢你的提示。现在我看到我一直在从contacts表中提取每一行,而实际上我只需要包含指定contact_id的行中的数据。我更新了select查询,如下所示,现在返回两行-两个指定的联系人ID各一行。不过,正如您所暗示的,select语句必须只返回一行。我们只需要整个查询在duplicates表中插入一行,其中包含一些硬编码的值和contacts表中的name值。也许我根本不应该使用连接,而是使用嵌套语句。选择32753、42260、false、false、567、ca.data->“firstname”,cb.data->“firstname”从联系人c左连接ca.list_id=567上的联系人ca和ca.contact_id=32753左连接cb上的联系人cb。list_id=567和cb.contact_id=42260,其中c.contact_id在32753中,42260我找到了一个最有效的解决方案。现在我如何扩展它来管理cb_firstname呢?插入副本联系人id a、联系人id b、忽略副本、已提取、列表id、联系人姓名选择32753、42260、false、false、567、,ca_firstname from select data->>“firstname”作为ca_firstname from contacts_id=32753 as c(不存在)从列表_id=567和联系人_id_a=32753和联系人_id_b=42260或联系人_id_a=42260和联系人_id_b=32753的副本中选择*;
insert into duplicates (...) 
select distinct ...