【问题标题】:What does second check constraint mean?第二个检查约束是什么意思?
【发布时间】:2013-08-01 22:11:09
【问题描述】:

我有以下代码

--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 约束。第二个陈述是什么意思?

【问题讨论】:

标签: sql


【解决方案1】:

第二条语句是多余的,唯一需要的情况是第一条语句有WITH NOCHECK。默认情况下,如果您未在 ADD CONSTRAINT 语句中明确声明 CHECKNOCHECK,则会添加 WITH CHECK

sql server management studio generate this code by default – Mikhail

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

Relevant documentation:

带检查 |用 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 约束。

【讨论】:

    【解决方案2】:

    来自文档:

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

    【讨论】:

      【解决方案3】:

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

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

      ALTER TABLE [nameOfMyTable] CHECK CONSTRAINT [nameOfMyConstraint];
      

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-05
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        相关资源
        最近更新 更多