PostgreSQL 16更新employees表触发规则无限递归错误求助
解决PostgreSQL UPDATE规则导致的无限递归错误
错误原因
你遇到的infinite recursion detected错误,核心原因是PostgreSQL的规则(Rule)是查询重写机制,而非行级触发逻辑:
- 当执行
UPDATE set salary=80000时,规则update_salary会将原查询重写为UPDATE set salary=70000的语句; - 这个重写后的UPDATE语句会再次进入规则校验流程;
- 你使用的
pg_trigger_depth() = 0仅对**触发器(Trigger)**生效,规则执行不会改变触发深度值,导致每次重写后的语句都会再次触发规则,最终陷入无限递归。
解决方案:替换规则为BEFORE UPDATE触发器
触发器是行级触发机制,能直接在更新前修改行数据,无需额外执行UPDATE语句,从根源避免递归。
步骤1:删除原有规则
drop rule if exists update_salary on rowan.employees;
步骤2:创建触发器函数
这个函数会在更新前检查薪资,超过70000则自动修正为70000:
create or replace function rowan.cap_salary() returns trigger as $$ begin if new.salary > 70000 then new.salary := 70000; end if; return new; end; $$ language plpgsql;
步骤3:绑定触发器到表
create trigger cap_salary_trigger before update on rowan.employees for each row execute function rowan.cap_salary();
测试验证
执行你原来的更新语句:
update rowan.employees set salary = 80000 where emp_id = 3;
查询数据:
select * from rowan.employees;
此时emp_id=3的薪资会被正确设置为70000,且无递归错误。
内容的提问来源于stack exchange,提问作者Rafael Orta
相关产品推荐
相关产品推荐

