【问题标题】:ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol]ALTER TABLE [dbo].[MyTable] 检查约束 [FK_MyTable_SomeCol]
【发布时间】:2025-11-23 14:45:02
【问题描述】:

如果我用外键编写一个表,它看起来像这样:

GO
ALTER TABLE [dbo].[MyTable]  WITH CHECK ADD  CONSTRAINT [FK_MyTable_SomeCol] FOREIGN KEY([SomeCol])
REFERENCES [dbo].[MyOtherTable] ([SomeCol])
GO
ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol]
GO

(ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol]) 的第二部分是什么?

【问题讨论】:

  • 当我使用外键 (SQL Server 2008 R2) 为表编写脚本时,我看不到第二条语句。您确定第一个不包含 WITH NOCHECK 而不是 WITH CHECK
  • 是的,它带有 NOCHECK。现在它的功能对我来说更清楚了。谢谢大家!

标签: tsql


【解决方案1】:

这是约束脚本方式的产物——尽管没有必要指定这些选项(因为它们是新约束的默认值),但同一个生成器也可以以完全相同的方式生成 NOCHECK 选项。

Documentation for ALTER TABLE 表示CHECK/NOCHECK 的两种不同用法:

WITH CHECK | WITH NOCHECK

指定是否针对新添加或重新启用的FOREIGN KEYCHECK 约束验证表中的数据。如果未指定,则假定 WITH CHECK 用于新约束,而 WITH NOCHECK 假定用于重新启用约束。

还有:

{ CHECK | NOCHECK } CONSTRAINT

指定启用或禁用约束名称。

所以一个选项是说“检查表的当前内容”,另一个是说“在添加新数据时验证新数据”。

【讨论】:

    【解决方案2】:

    这是为您的表实现referential integrity 的一种方式。

    【讨论】: