插入,冲突时进行更新,为什么失败?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规则是唯一的。