第二次检查约束意味着什么?

时间:2013-08-01 13:44:25

标签: sql

我有以下代码

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

3 个答案:

答案 0 :(得分:7)

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

  

sql server management studio generate this code by default – Mikhail

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

<强> Relevant documentation

  

WITH CHECK |没有检查

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

  •   
  • 如果您不想针对现有数据验证新的CHECK或FOREIGN KEY约束,请使用WITH NOCHECK。我们不建议这样做   这是罕见的情况。新约束将在中进行评估   所有以后的数据更新。任何被抑制的约束违规   通过WITH NOCHECK添加约束可能会导致将来更新   如果他们用不符合的数据更新行,则会失败   约束

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

  •   
     

{CHECK | NOCHECK} CONSTRAINT

     
      
  • 指定启用或禁用constraint_name。此选项只能与FOREIGN KEY和CHECK约束一起使用。当NOCHECK   如果已指定,则禁用约束以及将来插入或更新   到列不会根据约束条件进行验证。   不能禁用DEFAULT,PRIMARY KEY和UNIQUE约束。
  •   

答案 1 :(得分:1)

来自文档:

  

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

答案 2 :(得分:1)

如果在创建约束后立即运行,则给定上下文中的第二个语句是多余的(没有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能够解决这个问题吗?