【问题标题】:PostgreSQL increment serial column on updatePostgreSQL 在更新时增加串行列
【发布时间】:2015-03-21 22:50:02
【问题描述】:

我正在尝试在更新后增加串行列。我写了一个触发函数来帮忙。

    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 列的值保持不变。这个过程有问题吗?

【问题讨论】:

    标签: postgresql sql-update auto-increment


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-18
      • 2016-12-24
      • 1970-01-01
      • 2016-05-15
      • 2020-04-02
      • 2010-11-05
      • 2016-12-07
      相关资源
      最近更新 更多