创建触发器实现主表删除同步删子表,遇外键约束冲突报错求助
问题解决:删除主表记录时外键冲突的处理
错误原因
你创建的FOR DELETE触发器是在主表删除操作执行之后才触发的,此时数据库的外键约束已经先检查到status_so表中存在关联no_so='SO004'的记录,直接抛出冲突错误,触发器根本没机会执行删除子表记录的操作。
解决方案
方案1:改用INSTEAD OF DELETE触发器
这种触发器会替代主表的删除操作,先删除子表关联记录,再删除主表记录,避开约束检查报错:
CREATE TRIGGER trg_sales_order ON sales_order INSTEAD OF DELETE AS BEGIN -- 先删除子表关联记录 DELETE FROM status_so WHERE status_so.no_so IN (SELECT deleted.no_so FROM deleted) -- 再删除主表记录 DELETE FROM sales_order WHERE sales_order.no_so IN (SELECT deleted.no_so FROM deleted) END
方案2:修改外键约束为ON DELETE CASCADE(推荐)
直接在外键上配置级联删除,无需手动编写触发器,数据库会自动处理关联记录的删除:
- 删除原有外键约束:
ALTER TABLE status_so DROP CONSTRAINT FK_status_so_sales_order;
- 重新创建带级联删除的外键:
ALTER TABLE status_so ADD CONSTRAINT FK_status_so_sales_order FOREIGN KEY (no_so) REFERENCES sales_order(no_so) ON DELETE CASCADE;
之后执行DELETE FROM sales_order WHERE no_so = 'SO004'时,数据库会自动删除status_so中对应的关联记录,不会再触发冲突错误。
内容的提问来源于stack exchange,提问作者jerryb
相关产品推荐
相关产品推荐

