PostgreSQL 在更新时递增序列列
PostgreSQL increment serial column on update
我正在尝试在更新后增加一个序列列。我写了一个触发函数来帮忙。
CREATE FUNCTION "public"."update_transaction_id" () RETURNS trigger AS
$BODY$
DECLARE
curr_id integer;
BEGIN
curr_id = nextval(pg_get_serial_sequence('current_table', 'transaction_id'));
NEW.transaction_id = curr_id;
PERFORM SETVAL((SELECT pg_get_serial_sequence('current_table', 'transaction_id')), curr_id + 1, false);
RETURN NEW;
END;
$BODY$ LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER;
CREATE TRIGGER "trg_update_transaction_id" AFTER UPDATE
ON "current_table" FOR EACH ROW
EXECUTE PROCEDURE "public"."update_transaction_id"();
因此 table current_table 中的列是 transaction_id。查询执行正常,我的更新函数通过此触发器执行 运行。但是,transaction_id 列保持相同的值。这个程序有问题吗?
您的代码中存在三个错误。首先,您使用相等运算符 =
而不是赋值运算符 :=
。其次,你不应该 SETVAL
序列;它非常清楚如何维护自己。第三,此函数应由 BEFORE UPDATE
触发器调用,否则对 transaction_id
的分配将不会持续。
那么为什么不简单地:
CREATE FUNCTION update_transaction_id() RETURNS trigger AS $BODY$
BEGIN
NEW.transaction_id := nextval('seq_name');
RETURN NEW;
END;
$BODY$ LANGUAGE 'plpgsql';
您可以从 table 定义中简单地检索序列的 immutable 名称,所以直接插入。
我正在尝试在更新后增加一个序列列。我写了一个触发函数来帮忙。
CREATE FUNCTION "public"."update_transaction_id" () RETURNS trigger AS
$BODY$
DECLARE
curr_id integer;
BEGIN
curr_id = nextval(pg_get_serial_sequence('current_table', 'transaction_id'));
NEW.transaction_id = curr_id;
PERFORM SETVAL((SELECT pg_get_serial_sequence('current_table', 'transaction_id')), curr_id + 1, false);
RETURN NEW;
END;
$BODY$ LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER;
CREATE TRIGGER "trg_update_transaction_id" AFTER UPDATE
ON "current_table" FOR EACH ROW
EXECUTE PROCEDURE "public"."update_transaction_id"();
因此 table current_table 中的列是 transaction_id。查询执行正常,我的更新函数通过此触发器执行 运行。但是,transaction_id 列保持相同的值。这个程序有问题吗?
您的代码中存在三个错误。首先,您使用相等运算符 =
而不是赋值运算符 :=
。其次,你不应该 SETVAL
序列;它非常清楚如何维护自己。第三,此函数应由 BEFORE UPDATE
触发器调用,否则对 transaction_id
的分配将不会持续。
那么为什么不简单地:
CREATE FUNCTION update_transaction_id() RETURNS trigger AS $BODY$
BEGIN
NEW.transaction_id := nextval('seq_name');
RETURN NEW;
END;
$BODY$ LANGUAGE 'plpgsql';
您可以从 table 定义中简单地检索序列的 immutable 名称,所以直接插入。