Ssms
CHECK CONSTRAINT 不能辨識違反約束,但 DBCC CHECKCONSTRAINTS 可以
我有一個充滿數據的表,並且我對該表中的一個欄位設置了一個約束,以確保 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 KEY
或CHECK
約束驗證表中的數據。如果未指定,WITH CHECK
則假定為新約束,並**WITH NOCHECK
假定為重新啟用約束**。換句話說,除非您明確指定
WITH CHECK
,否則在啟用約束時不會驗證現有行。