两表间SQL触发器报错:外键关联表删除触发约束错误
错误原因及修复方案
核心错误点
- 触发器绑定表错误:当前触发器绑定在子表
planning.ordrelivraison_history的删除事件上,你执行主表planning.ordrelivraison的删除操作时,该触发器完全不会触发,外键约束会先校验到子表仍有引用记录,直接抛出报错。 - 触发器触发时机错误:即使触发器绑定到主表,使用
AFTER DELETE也无法生效,外键约束校验会在删除操作执行前完成,需要改为BEFORE DELETE触发,优先清理子表关联数据。 - OLD变量引用语法错误:OLD变量指代触发触发器的表中被删除的行记录,不需要加表名前缀,正确写法为
OLD.ordreid。
修复后的代码
-- 修正触发器函数 CREATE OR REPLACE FUNCTION delete_foreign_key() RETURNS TRIGGER AS $_$ BEGIN DELETE FROM planning.ordrelivraison_history WHERE ordrelivraison_history.ordrelivraisonid = OLD.ordreid; RETURN OLD; END; $_$ LANGUAGE plpgsql; -- 将触发器绑定到主表,使用BEFORE DELETE时机 CREATE TRIGGER delete_foreign_key_in_order_delivery_history BEFORE DELETE ON planning.ordrelivraison FOR EACH ROW EXECUTE PROCEDURE delete_foreign_key();
优化建议
你也可以直接修改外键约束添加级联删除规则,不需要额外编写触发器,实现相同效果:
ALTER TABLE planning.ordrelivraison_history DROP CONSTRAINT "Ordrelivraison_history_ordreid", ADD CONSTRAINT "Ordrelivraison_history_ordreid" FOREIGN KEY (ordrelivraisonid) REFERENCES planning.ordrelivraison(ordreid) ON DELETE CASCADE;
内容的提问来源于stack exchange,提问作者Tal Zana
相关产品推荐
相关产品推荐

