我有一个充满数据的表,并且我对该表中的一个字段设置了一个约束,以确保 2 个字段的总数等于第 3 个字段。例如:
ALTER TABLE [dbo].[Table1]
WITH NOCHECK ADD CONSTRAINT [CHK_TOTALS] CHECK ([Field3] = [Field1] + [Field2])
如果我再检查这个约束:
ALTER TABLE [dbo].[Table1]
CHECK CONSTRAINT [CHK_TOTALS]
没有返回错误,操作成功执行,因此好像所有行都满足约束。
但是,如果我随后执行DBCC CHECKCONSTRAINTS([Table1])
了几行,则返回约束CHK_TOTALS
,表明存在多个违反约束的行为。
我检查了数据,可以确认[Field1] + [Field2]
并非所有行的总数[Field3]
。
为什么第一次检查没有识别这些,而是使用了DBCC CHECKCONSTRAINTS
呢?
ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [CHK_TOTALS]
为表的所有未来更新启用约束。由于您最初创建了该约束WITH NOCHECK
,因此未验证当时存在的行,这适用(强调我的):换句话说,除非您明确指定
WITH CHECK
,否则在启用约束时不会验证现有行。