You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:54:57