postgresql - 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”不明确
解决方案
您需要在 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;
推荐阅读
- pip - 在 Debian Buster 上使用 pip 和 pipenv 安装软件包时收到错误消息
- c++ - 如何使用指针存储值以及如何显示所有存储的值?
- javascript - 使用 ES 模块时是否暗示“使用严格”?
- javascript - 使用 moment.js 获取从月初到今天经过的天数
- typescript - class-transformer Exclude undefined properties
- javascript - Retrieve and group by object element in JS (JSON)
- angular - "Cannot instantiate cyclic dependency!" when importing "formBuilder" into a service
- java - I want to get date in given format but this gives me output as 2020-03-65 15:23 instead of 2020-03-05 15:23,what is wrong with the code?
- python - Display SQL results in Django Admin interface
- python - 仅打印匹配正则表达式 Pandas 的字符串部分