gpt4 book ai didi

postgresql - Postgres 插入或更新触发器 WHEN 条件(旧)

转载 作者:行者123 更新时间:2023-11-29 11:19:00 24 4
gpt4 key购买 nike

我需要编写插入或更新触发器,但需要 WHEN 条件来比较旧行和新行。

根据文档,对于插入操作,OLD 为空。我如何在插入和更新触发器的 WHEN 条件下使用 OLD?

示例触发器:

CREATE TRIGGER mytrigger
BEFORE INSERT OR UPDATE ON "mytable"
FOR EACH ROW
WHEN (NEW.score > 0 AND OLD.score <> NEW.score)
EXECUTE PROCEDURE mytrigger();

但对于插入,OLD 为空。

最佳答案

选项 A:

您可以更改代码,使条件位于触发器函数中,而不是触发器本身。使用这种方法,OLD 将仅在 UPDATE 中使用。

触发器:

CREATE TRIGGER mytrigger
BEFORE INSERT OR UPDATE ON "mytable"
FOR EACH ROW
EXECUTE PROCEDURE mytrigger();

触发函数:

CREATE OR REPLACE FUNCTION mytrigger()
RETURNS trigger AS
$BODY$
begin
if NEW.score > 0 then
--code for Insert
if (TG_OP = 'INSERT') then
YOUR CODE
end if;

--code for update
if (TG_OP = 'UPDATE') then
if OLD.score <> NEW.score then -- (if score can be null see @voytech comment to this post)
YOUR CODE
end if;
end if;
end if;
return new;
end;
$BODY$
LANGUAGE plpgsql VOLATILE

选项 B:

按照 Thilo 的建议,编写两个共享相同触发器函数的触发器。

触发器:

CREATE TRIGGER mytrigger1
BEFORE INSERT ON "mytable"
FOR EACH ROW
WHEN NEW.score > 0
EXECUTE PROCEDURE mytrigger();


CREATE TRIGGER mytrigger2
BEFORE UPDATE ON "mytable"
FOR EACH ROW
WHEN (NEW.score > 0 AND OLD.score <> NEW.score)
EXECUTE PROCEDURE mytrigger();

触发函数:

CREATE OR REPLACE FUNCTION mytrigger()
RETURNS trigger AS
$BODY$
begin
YOUR CODE
return new;
end;
$BODY$
LANGUAGE plpgsql VOLATILE

关于postgresql - Postgres 插入或更新触发器 WHEN 条件(旧),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36029446/

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