У меня есть триггерная функция:
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? Какая ошибка?
Может быть, использовать setval функцию вместо alter sequence ... restart with?
setval
alter sequence ... restart with
SELECT pg_catalog.setval('aaa_id_seq'::regclass, maxid, false);
Ваша таблица, вероятно, пуста, поэтому
SELECT MAX(id) INTO maxid FROM aaa;
возвращает NULL;
NULL
Измените запрос на
SELECT COALESCE(MAX(id), <some_appropriate_value>) INTO maxid FROM aaa;
Я думаю, вам нужно использовать EXECUTE для команд определения данных (например, ALTER) в PL / pgSQL. И вам нужно LOCK TABLE aaa IN SHARE MODE; перед вычислением MAX (id), чтобы предотвратить одновременное изменение данных таблицы.
LOCK TABLE aaa IN SHARE MODE;