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

PostgreSQL并行unnest执行Upsert时UPDATE部分报列不存在错误如何解决

问题产生原因

PostgreSQL 的 INSERT ... ON CONFLICT DO UPDATE 语法存在作用域限制,UPDATE 子句仅允许访问两类对象:

  • 插入操作的目标表(本次场景中为 upsert 表)的原有字段
  • 系统内置的特殊表 excluded,该表存储的是本次 INSERT 语句尝试插入、但触发唯一约束冲突的行数据

你当前的写法直接引用了 SELECT 查询中定义的 sort_index 字段,该字段不属于 UPDATE 子句的允许访问范围,因此触发字段不存在的报错。

修复方案

只需将 UPDATE 赋值语句中的 sort_index 替换为 excluded.sort 即可。你在 INSERT 语句中已经将 SELECT 输出的 sort_index 映射为目标表的 sort 字段,excluded.sort 就对应你要更新的 sort_index 取值。

修复后的完整函数代码如下:

CREATE FUNCTION public.sort_category(category_ids integer[], sort integer[])
RETURNS void
AS $$
  INSERT INTO upsert (user_id, category_id, sort)
    SELECT sessions.user_id, category_id, sort_index
    FROM  UNNEST($1, $2) as input(category_id, sort_index), sessions
    WHERE sessions.session_token = 'a'
    ON CONFLICT (user_id, category_id) 
    DO 
      UPDATE SET sort = excluded.sort;
$$ LANGUAGE sql VOLATILE STRICT;

内容的提问来源于stack exchange,提问作者aaaaaaaaaaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:45:04