PostgreSQL 9.6执行INSERT ON CONFLICT更新时excluded.column相关报错如何解决
问题根因
你第二次报错的核心原因是:excluded 虚拟表的列名和你 INSERT 语句中指定的目标表字段名完全对应,和源表temp1的列名无关。
你写的插入语句是INSERT INTO lokasi_esb(id_esb, id_vertex_nearest) select id_esb,id_vertex from temp1,此时待插入的行在excluded里对应的两列名是id_esb、id_vertex_nearest,你取excluded.id_vertex自然会提示字段不存在。
修复方案
方案1:直接调整引用的excluded列名(推荐,改一处即可)
INSERT INTO lokasi_esb(id_esb, id_vertex_nearest) select id_esb,id_vertex from temp1 ON CONFLICT (id_esb) DO UPDATE SET id_vertex_nearest = excluded.id_vertex_nearest;
方案2:用UPDATE FROM语法(适合仅更新已有id_esb、不需要插入新行的场景)
如果你的需求只是给lokasi_esb里已存在的id_esb更新最近顶点id,不需要把temp1里独有的id_esb插入到lokasi_esb,用这个写法逻辑更准确:
UPDATE lokasi_esb SET id_vertex_nearest = temp1.id_vertex FROM temp1 WHERE lokasi_esb.id_esb = temp1.id_esb;
内容的提问来源于stack exchange,提问作者astaga
相关产品推荐
相关产品推荐

