PostgreSQL在更新时增加串行列

时间:2015-01-22 23:48:15

标签: postgresql sql-update auto-increment

我试图在更新后增加一个串行列。我已经写了一个触发函数来帮助。

    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"();

因此该列是current_table表中的transaction_id。查询执行正常,我的更新功能确实通过此触发器运行。但是,transaction_id列保持相同的值。这个程序有问题吗?

1 个答案:

答案 0 :(得分:0)

您的代码中有三个错误。首先,使用等于运算符=而不是赋值运算符:=。其次,你不应该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';

您可以从表定义中轻松检索序列的不可变名称,因此请将其直接插入。