函数中的PostgreSQL ALTER序列
我有触发功能:函数中的PostgreSQL ALTER序列,postgresql,sequence,Postgresql,Sequence,我有触发功能: 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 n
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美元?什么错误?我认为您需要在PL/pgSQL中使用数据定义命令(如ALTER)。您需要
在共享模式下锁定表aaa在计算MAX(id)之前进行编码>,以防止同时更改表数据。您的表可能是空的,所以
SELECT MAX(id) INTO maxid FROM aaa;
返回NULL
将查询更改为
SELECT COALESCE(MAX(id), <some_appropriate_value>) INTO maxid FROM aaa;
从aaa中选择COALESCE(MAX(id),)到maxid;
可能使用而不是更改序列。。。用
重新启动
SELECT pg_catalog.setval('aaa_id_seq'::regclass, maxid, false);
隐马尔可夫模型。。。如果我写了:CREATE或REPLACE函数update_aaa()将触发器返回为$$DECLARE maxid INTEGER;从aaa开始将MAX(id)选择到maxid中;更改序列aaa_id_seq以999重新启动;完;$$语言plpgsql;一切都很好……因为您在语句中没有使用任何变量,PL/pgSQL解析器也没有混淆。也许我应该编写“动态数据定义命令”。您通常需要将其设置为PERFORM
,最后一个false必须去掉,否则会出现一个off by one错误。