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这里的一些答案
什么让我失望?
你需要一个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.
| 归档时间: |
|
| 查看次数: |
1924 次 |
| 最近记录: |