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 被拒绝。审查数据模型中的循环依赖。
同一数据库的其他条目
- 1101Could not allocate a new page because of insufficient disk space in filegroup(文件组磁盘空间不足,无法分配新页)
- 3729Cannot DROP because it is being referenced by object(无法 DROP,因为它正被对象引用)
- 3961Snapshot isolation transaction failed because the object was modified by a DDL statement(快照隔离事务失败,因为对象已被 DDL 语句修改)
- 9421XML parsing: illegal xml character(XML 解析:非法 XML 字符)
- 15151Cannot find the object/principal because it does not exist or you do not have permission(找不到对象/主体,因为它不存在或您没有权限)
- 4834You do not have permission to use the bulk load statement(您没有使用大容量加载语句的权限)
- 10928Resource limit for the database has been reached (Azure SQL)(已达到数据库的资源限制)