我有触发功能:
CREATE OR REPLACE FUNCTION update_aaa() RETURNS TRIGGER AS $$
DECLARE maxid INTEGER;
BEGIN
SELECT MAX(id) INTO maxid FROM aaa;
ALTER SEQUENCE aaa_id_seq RESTART WITH maxid;
END;
$$ LANGUAGE plpgsql;
有错误:
ERROR: syntax error at or near "$1"
Line 1: ALTER SEQUENCE aaa_id_seq RESTART WITH $1
为什么1美元? 什么错误?
答案 0 :(得分:5)
也许使用setval
function而不是alter sequence ... restart with
?
SELECT pg_catalog.setval('aaa_id_seq'::regclass, maxid, false);
答案 1 :(得分:0)
我认为你需要在PL / pgSQL中使用EXECUTE来获取数据定义命令(如ALTER)。在计算MAX(id)之前,您需要LOCK TABLE aaa IN SHARE MODE;
以防止对表数据进行并发更改。
答案 2 :(得分:0)
你的桌子可能是空的,所以
SELECT MAX(id) INTO maxid FROM aaa;
返回NULL
;
将查询更改为
SELECT COALESCE(MAX(id), <some_appropriate_value>) INTO maxid FROM aaa;