我有以下代码
--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约束。什么意味着第二个陈述?
答案 0 :(得分:7)
第二个陈述是多余的,唯一需要的是第一个陈述是WITH NOCHECK
。默认情况下,如果您未在WITH CHECK
语句中明确说明CHECK
或NOCHECK
,则会添加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能够解决这个问题吗?