PostgreSQL Upsert中excluded列名称选择问题咨询
PostgreSQL Upsert 里 excluded.COLUMN 该填啥?
直接给结论:你得填 excluded.prec,不是excluded.p。
为啥?因为excluded是PostgreSQL Upsert语法里的特殊别名——它指代的是你这次INSERT操作里本来要插到目标表,但因为主键冲突被拦下来的那一行数据。换句话说,excluded的列名是跟着**目标表(也就是aemet.pmes)**走的,不是源表的列名。
看你的语句:你是把源表t的p字段,赋值给目标表的prec字段。当发生主键冲突要更新时,你要更新的是目标表的prec,而excluded.prec就是这次插入时原本要给prec的值(也就是t.p)。
要是你写excluded.p,PostgreSQL会直接报错,因为目标表aemet.pmes根本没有p这个列。
修正后的完整语句:
insert into aemet.pmes (indic , fecha, prec) select t.fid , t.fecha , t.p from tmp.pm_update_20230101 t where p is not null on conflict on constraint pmes_pkey do update set prec = excluded.prec;
额外提一句:用excluded.prec比直接写t.p更靠谱,因为到了do update的逻辑里,源表t的上下文已经失效了,没法直接引用t.p,而excluded能帮你复用插入时准备好的值。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

