gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:41:26 25 4
gpt4 key购买 nike

我有一张表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 |

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

ALTER TABLE "Table_A" ADD COLUMN "newId" BIGINT DEFAULT NULL;

现在我有:

\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 |

我希望 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();

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

INSERT INTO "Table_A" values (97, 1, 97);

newId 未填:

select * from "Table_A" where id = 97;
id | field1 | field2 | newId
----+----------+----------+-------
97 | 1 | 97 |

Note: I also tried with FOR EACH ROW from some answer here in SO

我想念什么?

最佳答案

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

CREATE TRIGGER "newIdAutoFill"
BEFORE INSERT OR UPDATE ON "Table_A"
FOR EACH ROW EXECUTE PROCEDURE autoFillNewId();

BEFORE 触发器在插入或更新新行之前发生,因此您仍然可以更改字段值。 AFTER 触发器可用于实现某些副作用,例如审计更改或对其他表的级联更改。

默认情况下,触发器是FOR EACH STATEMENT然后NEW参数没有定义(因为触发器不对行进行操作)。因此,您必须指定 FOR EACH ROW

关于用于在插入时填充新列的 postgresql 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36953697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com