6

我有以下代码

--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 约束。第二句话是什么意思?

4

3 回答 3

7

第二条语句是多余的,唯一需要的是如果第一条语句有WITH NOCHECK. WITH CHECK如果您没有明确声明CHECKNOCHECKADD CONSTRAINT声明中,默认添加。

sql server management studio 默认生成此代码 – Mikhail

因为代码是自动生成的,所以它只是通过一组步骤构建的。其中一些步骤会有一些重叠,因此“表定义”步骤可能会在创建表时启用或禁用检查约束,但“设置约束”步骤也可能会启用或禁用约束。

相关文件

带支票 | 带NOCHECK

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

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

  • 查询优化器不考虑用 NOCHECK 定义的约束。在使用 ALTER TABLE WITH CHECK CHECK CONSTRAINT ALL 重新启用它们之前,这些约束将被忽略。

{检查| NOCHECK } 约束

  • 指定启用或禁用约束名称。此选项只能与 FOREIGN KEY 和 CHECK 约束一起使用。当指定 NOCHECK 时,约束被禁用,并且将来对列的插入或更新不会根据约束条件进行验证。不能禁用 DEFAULT、PRIMARY KEY 和 UNIQUE 约束。
于 2013-08-01T13:49:23.763 回答
1

从文档:

指定启用或禁用约束名称。此选项只能与 FOREIGN KEY 和 CHECK 约束一起使用。当指定 NOCHECK 时,约束被禁用,并且将来对列的插入或更新不会根据约束条件进行验证。不能禁用 DEFAULT、PRIMARY KEY 和 UNIQUE 约束。

于 2013-08-01T13:48:47.543 回答
1

如果在创建约束后立即运行,则给定上下文中的第二条语句是多余的(如果没有WITH CHECK,创建外键约束 withADD CONSTRAINT FOREIGN KEYWITH CHECK默认立即执行)。

第二条语句用于重新启用约束检查

ALTER TABLE [nameOfMyTable] CHECK CONSTRAINT [nameOfMyConstraint];

通常在它被禁用之后,像这样:

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

脚本工具经常像这样创建 DDL - 矫枉过正,虽然我猜他们真的想确定 :)

还有第三种风格,即重新检查约束的有效性,例如在执行批量复制或类似操作后可能使约束无效(将其标记为不可信)。这样做是这样的:

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

编辑希望这个 SQLFiddle 能解决这个问题吗?

于 2013-08-01T13:52:53.540 回答