我试图在更新后增加一个串行列。我已经写了一个触发函数来帮助。
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列保持相同的值。这个程序有问题吗?
答案 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';
您可以从表定义中轻松检索序列的不可变名称,因此请将其直接插入。