1

我正在尝试添加检查约束。

我先做

ALTER TABLE [Production].[Products]  WITH CHECK 
ADD  CONSTRAINT [CHK_Products_unitprice] CHECK  (([unitprice]>=(0)))
GO

消息失败

消息 547,级别 16,状态 0,第 1 行
ALTER TABLE 语句与 CHECK 约束“CHK_Products_unitprice”冲突。数据库“TSQL2012”、表“Production.Products”、“单价”列中发生冲突。

然后我尝试在没有“WITH CHECK”选项的情况下添加约束,它仍然给出上述错误。

那么“with check”选项有什么意义呢?

4

1 回答 1

4

创建新检查约束WITH CHECK的默认选项是读取和评估现有值的选项,ALTER如果发现冲突则失败。

WITH NOCHECK如果您需要部署一个忽略现有现有错误值的检查约束并且您了解缺点(见下文),则可以使用选项,这是启用先前禁用的约束时的默认设置。

详情请参阅ALTER TABLE参考资料

带支票 | 带NOCHECK

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

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

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

于 2013-09-01T10:45:07.727 回答