首页 > 解决方案 > plpgsql 函数 - 列名不明确

问题描述

(我正在使用 Postgres 11.5)

我成为 Postgres 用户已有一段时间了,并且知道避免歧义的常用方法(例如,使用前缀命名函数输入等)。但我真的很挣扎ON CONFLICT

我也看到了这个 SO question How to disambiguate a plpgsql variable name in a ON CONFLICT 子句?,但要么我读错了,要么这似乎不是我遇到的问题。

这是我的功能:

create function foobar_data(p_category text,p_datapoint text) returns integer AS $$
BEGIN
        INSERT INTO foobar(category,datapoint,statcount) VALUES(p_category,p_datapoint,0)
        ON CONFLICT(category,datapoint) DO UPDATE
        SET statcount=statcount+1 where category=p_category and datapoint=p_datapoint;
        IF FOUND THEN
                return 1;
        ELSE
                return 0;
        END IF;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

这将返回错误:

错误:列引用“statcount”不明确

标签: postgresqlupsert

解决方案


您需要在 SET 部分的赋值右侧的列前面加上前缀(左侧是明确的):

INSERT INTO foobar(category,datapoint,statcount) 
VALUES(p_category,p_datapoint,0)
ON CONFLICT(category,datapoint) DO UPDATE
  SET statcount = foobar.statcount + 1 
where category = p_category 
  and datapoint = p_datapoint;

推荐阅读