症状
假定您尝试删除的数据从一个表中,数据正在引用其他表中 Microsoft SQL Server 2016年和 2017年。I浏览查询的 f 执行计划,您可以看到它使用一个外键引用检查运算符.在此情况下,您可能会收到下面的错误消息即使行正在 删除未引用其他表中:
消息 547,第 16 级状态 0,行LineNumber
DELETE 语句与引用约束冲突
状态
Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。
解决方案
此问题已在以下 SQL Server 的累积更新中修复:
注意:此问题已在累积更新 6 解决 SQL Server 2016 SP2。
有关 SQL Server 的累积更新:
SQL Server 的每个新累积更新包含以前的累积更新所包含的所有修补程序和所有安全修补程序。查看 SQL Server 的最新累积更新:
解决方法
若要解决此问题,请使用以下某种方法:
-
兼容性级别低于 130 用于运行此查询。
-
更改引用表上的索引结构。
更多信息
开始数据库范围配置兼容性级别 在 SQL Server 2016年 130,查询执行计划可以使用外键引用 检查操作员能够检验是否以其他任何行被引用表中的行 通过引用完整性约束的表。如果可以使用此类运算符 大量的外部表的被引用表。在此运算符, SQL Server 中执行此类检查的每个引用表中选择索引。如果 引用的表有索引的多个列,这样一些 列的开头不是外键,但一些其他的一部分 列的外键的一部分。这可能会导致不正确的检查执行中 通过 SQL Server。
例如,请考虑下面的架构:
创建表 tpk (pk int 约束 cpk 主键聚簇)
创建表 tfk (int,fk int 外键引用约束 cfk tpk,索引 ia clustered(a,fk))
这种模式可能会导致此问题,但如果您更改 中的列顺序索引到 ia (fk,),它将不会。
参考
了解 术语的用于描述软件更新 Microsoft。