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
相关产品推荐
相关产品推荐

