第二个检查约束是什么意思?

7
我有以下代码。
--first statement
ALTER TABLE [nameOfMyTable]  WITH CHECK ADD  CONSTRAINT [nameOfMyConstraint] FOREIGN KEY([myFK])
REFERENCES [tableReference] ([myFK])
GO
--second statement
ALTER TABLE [nameOfMyTable] CHECK CONSTRAINT [nameOfMyConstraint]
GO

首先,我在一个表上定义了一个CHECK约束。第二个语句是什么意思?


2
SQL Server Management Studio 默认生成此代码。 - isxaker
2
看一下:https://dev59.com/CHRB5IYBdhLWcg3wvpmc - makciook
3个回答

8
第二个语句是多余的,唯一需要它的情况是如果第一个语句带有WITH NOCHECK。默认情况下,如果在ADD CONSTRAINT语句中没有显式指定CHECKNOCHECK,则会添加WITH CHECK

SQL Server Management Studio默认生成此代码-Mikhail

由于代码是自动生成的,因此只是按照一组步骤构建。其中一些步骤可能会有重叠,因此“表定义”步骤可能在创建表时启用或禁用检查约束,而“设置约束”步骤也可能启用或禁用约束。

相关文档

WITH CHECK | WITH NOCHECK

  • 指定表中的数据是否要验证新添加或重新启用的FOREIGN KEY或CHECK约束。如果不指定,则假定对于新约束使用WITH CHECK,对于重新启用的约束使用WITH NOCHECK。

  • 如果您不想将新的CHECK或FOREIGN KEY约束与现有数据进行验证,请使用WITH NOCHECK。我们不建议这样做,除非在极少数情况下。新约束将在以后的所有数据更新中得到评估。当添加约束时,被WITH NOCHECK抑制的任何约束违规可能会导致将来的更新失败,因为它们更新了不符合约束条件的数据行。

  • 查询优化器不考虑定义为WITH NOCHECK的约束。这种约束被忽略,直到使用ALTER TABLE WITH CHECK CHECK CONSTRAINT ALL重新启用。

{ CHECK | NOCHECK } CONSTRAINT

  • 指定constraint_name是启用还是禁用。此选项仅适用于FOREIGN KEY和CHECK约束。当指定NOCHECK时,约束被禁用,并且对列的未来插入或更新不会针对约束条件进行验证。DEFAULT、PRIMARY KEY和UNIQUE约束无法禁用。

1
在创建约束时,如果立即运行第二条语句(带或不带WITH CHECK),它就变得多余了。使用ADD CONSTRAINT FOREIGN KEY创建外键约束默认会立即进行WITH CHECK。第二条语句用于重新启用约束检查。
ALTER TABLE [nameOfMyTable] CHECK CONSTRAINT [nameOfMyConstraint];

通常在禁用后,像这样:

usually after it has been disabled, like so:

ALTER TABLE [nameOfMyTable] NOCHECK CONSTRAINT [nameOfMyConstraint];
GO

脚本工具通常会创建像这样的DDL - 这有点过度,尽管我猜他们真的想确保 :)

还有第三种方式,即重新检查约束的有效性,例如在执行批量复制或类似操作之后,可能会使约束无效(标记为不可信)。可以通过以下方式完成:

ALTER TABLE [nameOfMyTable] WITH CHECK CHECK CONSTRAINT [nameOfMyConstraint];

编辑 希望这个 SQLFiddle 能够澄清这个问题?


1

从文档中得知:

指定约束名是启用还是禁用。此选项仅适用于FOREIGN KEY和CHECK约束。当指定NOCHECK时,约束被禁用,并且对列的未来插入或更新不会根据约束条件进行验证。默认、主键和唯一约束不能被禁用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接