函数中的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,以防止同时更改表数据。

您的表可能是空的,所以

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错误。