更改表检查约束


25

在SQL Server的对象资源管理器中,选择并编写外键约束脚本时,将生成以下代码。

     USE [MyTestDatabase]
     GO

     ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID])
     REFERENCES [dbo].[T1] ([T1ID])
     GO

     ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
     GO

最后一条语句“ ALTER TABLE CHECK CONSTRAINT”的目的是什么?是否运行它似乎并不重要。它不会对现有的不良数据失败,也不会更改对新数据强制实施约束的情况。

谢谢!

Answers:


23

它确保在创建约束后将其启用。您的ALTER TABLE陈述包括WITH NOCHECK说在约束创建期间不检查现有不良数据的那一部分。

如所写,由于WITH NOCHECK第一条语句中的约束,将不对照约束检查现有数据。发出第二条语句将启用针对约束的检查,以检查约束所涵盖的表的任何将来更改,直到ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1]发出an为止。

声明中所写的基本上是“创建此外键约束,但不要将其与现有数据进行核对。请使其对数据的任何即将发生的更改都处于活动状态。”


实际上,我检查了一下,如果有错误的数据并没有什么不同,第一行或第二行不会失败。要一次失败,他们必须看起来像这样:
Delux 2012年

2
ALTER TABLE [dbo]。[T2]带检查检查约束[FK_T2_T1]
Delux

对。但是当您尝试运行违反约束的INSERT或UPDATE时,您将看到它失败。如果在执行这2条语句时存在错误数据,则不会失败。
squillman 2012年

7

您的第一条语句创建了一个禁用的约束。它需要被启用并且可能是受信任的。以下奇怪的语法将确保您的约束已启用并受信任:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Hugo Kornelis撰写的一篇非常不错的博客文章对此做了详尽的解释:您能相信自己的约束吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.