添加约束时不确定WITH CHECK子句

时间:2013-09-01 09:36:52

标签: sql-server tsql check-constraints

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

我先做

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

失败并显示消息

  

Msg 547,Level 16,State 0,Line 1
  ALTER TABLE语句与CHECK约束“CHK_Products_unitprice”冲突。冲突发生在数据库“TSQL2012”,表“Production.Products”,列'unitprice'。

然后我尝试添加没有“WITH CHECK”选项的约束,它仍然会出现上述错误。

那么“带支票”选项有什么意义呢?

1 个答案:

答案 0 :(得分:4)

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

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

有关详细信息,请参阅ALTER TABLE reference

  

WITH CHECK |没有检查

     

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

     

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

     

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