更改表检查约束

Del*_*lux 31 sql-server-2008 check-constraints

在 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
Run Code Online (Sandbox Code Playgroud)

最后一条语句“ALTER TABLE CHECK CONSTRAINT”的目的是什么?它是否运行似乎并不重要。它不会在现有的坏数据上失败,也不会改变将在新数据上强制执行的约束。

谢谢!

squ*_*man 29

它确保在创建约束后启用约束。您的ALTER TABLE声明包括WITH NOCHECK哪一部分说明在创建约束期间不检查现有的坏数据。

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

所写的语句基本上是在说“创建此外键约束,但不要根据现有数据检查它。使其在任何即将发生的数据更改时处于活动状态。”

  • ALTER TABLE [dbo].[T2] WITH CHECK CHECK CONSTRAINT [FK_T2_T1] (2认同)
  • 对。但是在此之后,当您尝试运行违反约束的 INSERT 或 UPDATE 时,您会看到它失败。如果在执行这 2 个语句时存在错误数据,则两者都不会失败。 (2认同)

A-K*_*A-K 10

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

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;
Run Code Online (Sandbox Code Playgroud)

Hugo Kornelis 有一篇非常好的博客文章,详细解释了它:你能相信你的约束吗?