plpgsql 函数 - 列名不明确

plpgsql function - column name is ambiguous

(我正在使用 Postgres 11.5)

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

我也看到了这个 SO 问题 ,但要么是我看错了,要么这似乎不是我遇到的问题。

这是我的功能:

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;

这个returns错误:

ERROR: column reference "statcount" is ambiguous

您需要在 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;

歧义存在于原始列值和新列值之间。为原始值使用 table 名称限定列,为新值使用 EXCLUDED 限定列:

SET statcount=foobar.statcount+1

您不能限定第一个 statcount,因为不允许使用 SQL 语法(该列自动属于更新后的 table,因此没有歧义)。