PostgreSQL 9.5 ON CONFLICT DO UPDATE命令不能再次影响行

时间:2017-07-19 14:23:08

标签: postgresql upsert

我有一个表,我想从UPSERT到另一个,当尝试启动查询时,我得到“不能再次影响行”错误。所以我试着看看我的第一个表上是否有一些关于具有UNIQUE约束的字段的重复,而我没有。我必须遗漏一些东西,但由于我无法弄清楚是什么(并且我的查询有点复杂,因为它包含了一些JOIN),这里是查询,具有UNIQUE约束的字段是“identifiant_immeuble”:

with upd(a,b,c,d,e,f,g,h,i,j,k) as(
select id_parcelle, batimentimmeuble,etatimmeuble,nb_loc_hab_ma,nb_loc_hab_ap,nb_loc_pro, dossier.id_dossier, adresse.id_adresse, zapms.geom, 1, batimentimmeuble2
from public.zapms
left join geo_pays_gex.dossier on dossier.designation_siea=zapms.id_dossier
left join geo_pays_gex.adresse on adresse.id_voie=(select id_voie from geo_pays_gex.voie where (voie.designation=zapms.nom_voie or voie.nom_quartier=zapms.nom_quartier) and voie.rivoli=lpad(zapms.rivoli,4,'0'))
and adresse.num_voie=zapms.num_voie
and adresse.insee=zapms.insee_commune::integer
)
insert into geo_pays_gex.bal2(identifiant_immeuble, batimentimmeuble, id_etat_addr, nb_loc_hab_ma, nb_loc_hab_ap, nb_loc_pro, id_dossier, id_adresse, geom, raccordement, batimentimmeuble2)
select a,b,c,d,e,f,g,h,i,j,k from upd
on conflict (identifiant_immeuble) do update
set batimentimmeuble=excluded.batimentimmeuble, id_etat_addr=excluded.id_etat_addr, nb_loc_hab_ma=excluded.nb_loc_hab_ma, nb_loc_hab_ap=excluded.nb_loc_hab_ap, nb_loc_pro=excluded.nb_loc_pro, 
id_dossier=excluded.id_dossier, id_adresse=excluded.id_adresse,geom=excluded.geom, raccordement=1, batimentimmeuble2=excluded.batimentimmeuble2
;

正如您所看到的,我在此查询中使用了几个中间表:一个用于存储街道名称(voie),一个与存储地址相关的名称(adresse,基本上通过外键与街道名称表相关的数字) ),另一个存储与项目名称相关的其他数据(档案)。

我不知道我可以提供哪些其他信息来帮助找到答案,我想我最好不要分享我的表格的实际内容,因为它可能涉及一些隐私法规等。

感谢您的关注。

编辑:我通过从bal2表中删除zapms表中的条目找到了一种解决方法,因此     从geo_pays_gex.bal2中删除bal2.identifiant_immeuble in(从zapms中选择id_parcelle); 但这并不完全令人满意,因为我本来希望跟踪数据创建者和创建日期,以及数据被修改的事实(我有一些字段来存储这些信息),这里我只是擦除所有这段历史...我还有另一张表,其中bal2表的主键作为外键。我仍然在数据库创建中,所以我可以截断这个表,但是在生产中它是不可能的,因为我会丢失一些数据。

0 个答案:

没有答案