Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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,pgadmin_Postgresql_Upsert - Fatal编程技术网

插入,冲突时进行更新,为什么失败?postgresql,pgadmin

插入,冲突时进行更新,为什么失败?postgresql,pgadmin,postgresql,upsert,Postgresql,Upsert,我试图在一个大的旧表中插入一个新表来更新多行, 我的问题是: INSERT INTO site_settings (set_id, set_sit_id,set_setting_name,set_setting_type) SELECT set_id, set_sit_id, replace(TempTable2.stp_device_pool_filter, '${siteShortName}', TempTable2.sit_short_name), set_setting_type fro

我试图在一个大的旧表中插入一个新表来更新多行, 我的问题是:

INSERT INTO site_settings (set_id, set_sit_id,set_setting_name,set_setting_type)
SELECT set_id, set_sit_id, replace(TempTable2.stp_device_pool_filter, '${siteShortName}', TempTable2.sit_short_name), set_setting_type from TempTable2 where set_setting_type='DEVICE_POOL' 
ON CONFLICT (set_id) DO UPDATE 
  SET set_sit_id=excluded.set_sit_id,
  set_setting_name=excluded.set_setting_name,
  set_setting_type=excluded.set_setting_type;
它向我返回消息:

重复的键值违反了唯一约束“唯一站点设置”
详细信息:键(设置位置id、设置名称、设置类型)=(13、SBA123 rr、设备池)已存在

然而,我曾经使用类似的查询来更新一个更复杂的表,它是有效的


不知道问题出在哪里

您在
上有另一个唯一约束(set\u situ\u id,set\u setting\u name,set\u setting\u type)
但是您的插入只处理
set\u id
上的重复项好的,那么我如何解决问题?不幸的是,您只能在冲突()上用
指定一个唯一约束
因此,您需要决定要忽略哪一个。我放弃了约束,现在它起作用了,谢谢。对此要非常小心,您可能已经使插入生效,但这可能会给业务带来重大问题。我猜,但你放弃了对(设置位置id、设置名称、设置类型)的限制,并将其保留在站点id上。现在,我想站点id就是你的PK。删除约束的问题看起来像是强制执行业务规则,PK通常对业务没有任何意义。如果是这种情况,您现在有重复的业务信息(可能不一致),尽管PK使该行对于DBMS规则是唯一的。