PostgreSQL ALTER SEQUENCE功能

时间:2012-01-25 10:07:51

标签: 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 near "$1"
Line 1: ALTER SEQUENCE aaa_id_seq RESTART WITH  $1 

为什么1美元? 什么错误?

3 个答案:

答案 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;