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,因此没有歧义)。
(我正在使用 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,因此没有歧义)。