gpt4 book ai didi

PostgreSQL:检查触发器函数中的 NEW 和 OLD

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

我想创建一个触发器来计算行数并更新另一个表中的字段。我当前的解决方案适用于 INSERT 语句,但在我删除一行时失败。

我当前的功能:

 CREATE OR REPLACE FUNCTION update_table_count()
RETURNS trigger AS
$$
DECLARE updatecount INT;
BEGIN
Select count(*) into updatecount
From source_table
Where id = new.id;
Update dest_table set count=updatecount
Where id = new.id;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';

触发器是一个非常基本的触发器,看起来像。

CREATE TRIGGER count_trigger
AFTER INSERT OR DELETE
ON source_table
FOR EACH ROW
EXECUTE PROCEDURE update_table_count();

当我执行 DELETE 语句时,出现以下错误:

ERROR: record "new" is not assigned yet

DETAIL: The tuple structure of a not-yet-assigned record is indeterminate.

我知道一种解决方案是只为 DELETE 创建一组触发器和函数,为 INSERT 语句创建一组。但我想做得更优雅一点,想知道是否有解决方案来检查当前上下文中是否存在 NEW 或 OLD,并只实现一个 IF ELSE block 。但是我不知道如何检查这个上下文相关的项目。

谢谢你的帮助

最佳答案

使触发器函数根据触发器的触发方式执行不同操作的通常方法是通过 TG_OP 检查触发器操作。

CREATE OR REPLACE FUNCTION update_table_count()
RETURNS trigger AS
$$
DECLARE
updatecount INT;
BEGIN
if tg_op = 'UPDATE' then
select count(*) into updatecount from source_table where id = new.id;
update dest_table set count=updatecount where id = new.id;
elsif tg_op = 'DELETE' then
... do something else
end if;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;

无关,但是:语言名称是一个标识符。不要使用单引号引用它。

关于PostgreSQL:检查触发器函数中的 NEW 和 OLD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50962700/

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