【问题标题】:Why is SQL Server is adding a check constraint to my nocheck FK constraint?为什么 SQL Server 向我的 nocheck FK 约束添加检查约束?
【发布时间】:2019-09-04 18:16:11
【问题描述】:

SQL Server 正在向我的 nocheck 约束添加一个检查约束。

我从这个开始:

ALTER TABLE [dbo].[Subjects]  WITH NOCHECK ADD  CONSTRAINT [FK_Subject_OrganizationSubjectRank] FOREIGN KEY([OrganizationId], [StatusId], [Rank])
REFERENCES [dbo].[OrganizationSubjectRanks] ([OrganizationId], [OrganizationSubjectStatusId], [Name])
GO

每次我执行时,SQL 服务器都会将此添加到我的代码中:

ALTER TABLE [dbo].[Subjects] CHECK CONSTRAINT [FK_Subject_OrganizationSubjectRank]
GO

这会导致外键约束错误。

如何防止 SQL Server 将此检查约束添加到我的代码中?

【问题讨论】:

  • “SQL 服务器将此添加到我的代码中”是什么意思?什么时候出现约束错误?
  • 不,它不会导致您的错误。您加载数据和执行这些语句的方式会导致错误。第二条语句只是让引擎检查您的外键关系是否与现有数据一致。
  • @Tab Alleman,我创建了上面的代码,执行后我返回并看到 SQL Server 添加了检查约束(下面的代码)。
  • @SMor,我同意。我们不希望检查,但 SQL Server 一直在添加它。

标签: sql sql-server foreign-keys constraints


【解决方案1】:

简短的回答是运行:

ALTER TABLE [dbo].[Subjects] NOCHECK CONSTRAINT [FK_Subject_OrganizationSubjectRank]

解释是WITH CHECK | WITH NOCHECKCHECK | NOCHECK 有两个独立的功能。 WITH CHECK | WITH NOCHECK 适用于并且仅适用于命令运行时的现有数据。 CHECK | NOCHECK 适用于并且仅适用于新数据。

在创建 FK 约束时,您有关于现有数据的 WITH CHECK | WITH NOCHECK 选项,但会自动设置 CHECK 选项。这就是您看到第二个命令的原因。为了覆盖CHECK 的默认值,您需要显式运行一个额外的NOCHECK 命令。

请参阅此链接以获取更多参考:https://sqlpowered.com/foreign-keys-check-nocheck-and-with-check/

【讨论】:

    【解决方案2】:

    这是预期行为。

    当您使用 WITH NOCHECK 创建约束时,这意味着,在您 ALTER 表并添加约束时,不会检查约束以查看表中已有的数据是否与它冲突。

    之后,它就像其他任何约束一样成为常规约束。所有未来的 INSERT/UPDATES 都必须遵守约束。因此,如果您刷新 SSMS 并编写表格脚本,您将只看到没有任何 NOCHECK 的 CONSTRAINT。

    总而言之,NOCHECK 仅在您更改表时才重要。之后,它就没有效果了,并且约束的行为就像你在创建它时没有使用 NOCHECK 一样。

    如果您尝试永久删除约束,则需要删除它。

    【讨论】:

    • 我希望在几点上有所不同。 1- 如果您使用 WITH NOCHECK 选项创建 FK 并编写表格脚本,您仍会看到 WITH NOCHECK。 2-您可以单独的 ALTER命令初始FK创建之后使用NOCHECK选项为未来的INESRT/UPDATES禁用FK约束,尽管WITH NOCHECK 选项确实不会影响未来的插入/更新。 WITH NOCHECKNOCHECK 具有不同的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2015-08-07
    • 1970-01-01
    • 2018-01-04
    • 2011-02-16
    相关资源
    最近更新 更多