我想创建一个触发器来计算行数并更新其他表中的字段。我当前的解决方案适用于 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 语句时,出现以下错误:
错误:记录“新”尚未分配
详细信息:尚未分配的记录的元组结构是不确定的。
我知道一种解决方案可能是为 DELETE 创建一组触发器和函数,为 INSERT 语句创建一组触发器和函数。但我想做得更优雅一点,想知道是否有解决方案来检查当前上下文中是否存在 NEW 或 OLD 并仅实现 IF ELSE 块。但我不知道如何检查这个上下文敏感项目。
感谢您的帮助
使触发器函数根据触发器的触发方式执行不同操作的常用方法是通过以下方式检查触发器操作:TG_OP https://www.postgresql.org/docs/current/static/plpgsql-trigger.html
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;
不相关,但是:语言名称是一个标识符。不要使用单引号引用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)