DBAtlas · 数据库运维图谱

1785: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths(引入 FOREIGN KEY 约束可能导致循环或多重级联路径)

SQL Server

含义

要添加的外键可能在级联(ON DELETE/UPDATE CASCADE)操作中形成循环,或形成通向同一张表的多条级联删除/更新路径。为避免级联行为不明确,SQL Server 拒绝该操作。

原因

带级联操作的 FK 在表之间形成循环引用(A->B->A),或形成通向同一张表的多条级联路径。SQL Server 不允许这样做,以防止级联顺序不明确和无限循环。

解决方法

将外键定义为 ON DELETE NO ACTION / ON UPDATE NO ACTION(去掉级联):ALTER TABLE child ADD CONSTRAINT fk ... FOREIGN KEY (...) REFERENCES parent(...) ON DELETE NO ACTION; 用 INSTEAD OF DELETE 触发器实现所需的级联删除:触发器先删除子行,再删除父行(例如 DELETE c FROM child c JOIN deleted d ON c.parent_id = d.id; DELETE e FROM parent e JOIN deleted d ON e.id = d.id;)。AFTER DELETE 触发器不起作用;FK 检查在触发器之前执行,因此删除会以错误 547 被拒绝。审查数据模型中的循环依赖。

在 DBAtlas 中打开 →

同一数据库的其他条目