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 名称,所以直接插入。