PostgreSQL触发器:简洁处理NEW/OLD记录避免代码重复
简洁处理PostgreSQL触发器中NEW/OLD记录的方法
这个场景我太熟悉了——写INSERT OR UPDATE触发器时,反复判断TG_OP来切换NEW和OLD记录,不仅代码冗余,后续维护也麻烦。其实只需要用一个变量统一指代要处理的记录,就能把重复逻辑合并,让代码清爽很多。
直接给你优化后的完整示例:
CREATE FUNCTION myfunc() RETURNS TRIGGER AS $$ DECLARE rec RECORD; ids int[]; BEGIN -- 用CASE语句一次性确定要操作的记录 rec := CASE TG_OP WHEN 'INSERT', 'UPDATE' THEN NEW -- 如果后续需要支持DELETE操作,只需在这里加一行 -- WHEN 'DELETE' THEN OLD ELSE NULL END; -- 统一执行你的业务逻辑,不用再反复判断TG_OP IF rec IS NOT NULL THEN ids := ids || rec.id; -- 这里可以添加所有你需要执行的查询/操作,比如: -- UPDATE some_table SET status = 'processed' WHERE id = rec.id; -- CALL some_other_function(rec.id); END IF; -- 触发器必须返回对应的值,保持PostgreSQL的触发器规范 RETURN CASE TG_OP WHEN 'INSERT', 'UPDATE' THEN NEW WHEN 'DELETE' THEN OLD ELSE NULL END; END; $$ LANGUAGE plpgsql;
为什么这个方法好用?
- 代码复用:所有业务逻辑只写一遍,不用针对
INSERT和UPDATE重复编写相同的查询 - 扩展性强:如果后续要给触发器加
DELETE支持,只需要修改rec赋值的CASE语句,业务逻辑部分完全不用动 - 可读性高:一眼就能看明白我们要处理的是哪条记录,不用在代码里到处找
TG_OP的判断
内容的提问来源于stack exchange,提问作者mla
相关产品推荐
相关产品推荐

