我创建了一个带有外键约束的表。当我通过 SSMS 生成表创建脚本时,它会创建以下代码:
ALTER TABLE [dbo].[MainTable] WITH CHECK ADD CONSTRAINT [FK_MainTable_ForeignKeyTable] FOREIGN KEY([FK_Field])
REFERENCES [dbo].[ForeignKeyTable] ([PK_Field])
GO
ALTER TABLE [dbo].[MainTable] CHECK CONSTRAINT [FK_MainTable_ForeignKeyTable]
GO
由于第一条语句创建了 WITH CHECK 约束,这是否会使第二条语句变得多余?如果不是,那么 CHECK CONSTRAINT 完成了什么,而 WITH CHECK 没有完成?
我看到了ALTER TABLE CHECK CONSTRAINT,但在这种情况下,SSMS 正在生成第一个带有 NOCHECK 的语句,因此同时拥有这两个语句是有意义的。
第一条语句更改表以添加约束。第二条语句启用或禁用将来插入或更新的约束。
因此,
ALTER TABLE ... CHECK CONSTRAINT ...
为将来的插入/更新启用约束。如果指定ALTER TABLE ... NOCHECK CONSTRAINT ...
,则禁用约束,从而允许将来的插入和更新成功,即使外键引用的表中的列不包含匹配值。通过此示例,您可以看到同时存在这两个语句的实用性:因此,我们创建了两个没有定义关系的表。后来,我们决定要设计关系,所以我们添加一个外键
dbo.b
来引用dbo.a
. 我们希望检查现有行的有效性,但不关心将来可能添加的新行1。都好。现有行已验证,新行不会针对外键进行验证:
表格内容:
结果:
因此,由于在 SSMS 中编写表格的代码必须涵盖所有可能发生的情况,因此
ALTER TABLE ... CHECK CONSTRAINT ...
即使不需要,它也会输出 a,而且在绝大多数情况下肯定不需要。1 - 为什么有人想要验证现有行,但不关心新行有点神秘,但你去吧。