postgresql触发器,用于在插入时填充新列

ped*_*o91 3 postgresql triggers

我有一张桌子Table_A:

\d "Table_A";
                           Table "public.Table_A"
  Column  |  Type   |                          Modifiers
----------+---------+-------------------------------------------------------------
 id       | integer | not null default nextval('"Table_A_id_seq"'::regclass)
 field1   | bigint  |
 field2   | bigint  |
Run Code Online (Sandbox Code Playgroud)

现在我想添加一个新列.所以我跑:

ALTER TABLE "Table_A" ADD COLUMN "newId" BIGINT DEFAULT NULL;
Run Code Online (Sandbox Code Playgroud)

我现在有:

\d "Table_A";
                           Table "public.Table_A"
  Column  |  Type   |                          Modifiers
----------+---------+-------------------------------------------------------------
 id       | integer | not null default nextval('"Table_A_id_seq"'::regclass)
 field1   | bigint  |
 field2   | bigint  |
 newId    | bigint  |
Run Code Online (Sandbox Code Playgroud)

我想要newId填充与id新/更新行相同的值.

我创建了以下函数并触发:

CREATE OR REPLACE FUNCTION autoFillNewId() RETURNS TRIGGER AS $$
BEGIN
  NEW."newId" := NEW."id";
  RETURN NEW;
END $$ LANGUAGE plpgsql;

CREATE TRIGGER "newIdAutoFill" AFTER INSERT OR UPDATE ON "Table_A" EXECUTE PROCEDURE autoFillNewId();
Run Code Online (Sandbox Code Playgroud)

现在如果我插入一些东西:

INSERT INTO "Table_A" values (97, 1, 97);
Run Code Online (Sandbox Code Playgroud)

newId 没有填写:

select * from "Table_A" where id = 97;
 id | field1   | field2   | newId
----+----------+----------+-------
 97 |        1 |       97 |
Run Code Online (Sandbox Code Playgroud)

注意:我也尝试过FOR EACH ROW这里的一些答案

什么让我失望?

Pat*_*ick 5

你需要一个BEFORE INSERT OR UPDATE ... FOR EACH ROW触发器来完成这项工作:

CREATE TRIGGER "newIdAutoFill"
INSERT OR UPDATE ON "Table_A"
FOR EACH ROW EXECUTE PROCEDURE autoFillNewId();
Run Code Online (Sandbox Code Playgroud)

一个BEFORE触发发生新的行插入或更新之前,所以你仍然可以进行更改的字段值.一个AFTER触发器是实现一些副作用,如变更或级联更改其他表的审核非常有用.

默认情况下,触发器是FOR EACH STATEMENT,然后NEW未定义参数(因为触发器不在一行上操作).所以你必须指定FOR EACH ROW.