Ssms

CHECK CONSTRAINT 不能辨識違反約束,但 DBCC CHECKCONSTRAINTS 可以

  • July 6, 2020

我有一個充滿數據的表,並且我對該表中的一個欄位設置了一個約束,以確保 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 | WITH NOCHECK

指定是否針對新添加或重新啟用FOREIGN KEYCHECK約束驗證表中的數據。如果未指定,WITH CHECK則假定為新約束,並**WITH NOCHECK假定為重新啟用約束**。

換句話說,除非您明確指定WITH CHECK,否則在啟用約束時不會驗證現有行。

引用自:https://dba.stackexchange.com/questions/270480