2012-08-31 17 views
15

我有一個SQL Server 2012的分貝引用Countries.CountryID = States.CountryIDSQL數據後沒有檢查外鍵,則重新啓用查詢優化

我需要重新Countries表,所以我把這個外鍵從States一個外鍵約束表(否則它不會讓我放棄國家)

後,我這樣做,我想重新上States的FK但它不會讓我,除非我指定NO CHECK這樣:

ALTER TABLE States 
    WITH NOCHECK 
    ADD CONSTRAINT FK_StatesCountries FOREIGN KEY (CountryID) REFERENCES Countries(CountryID) 
GO 

我剛開始並沒有意識到一些國家的行有CountryID沒有匹配Countries.CountryID記錄。很明顯,WITH NOCHECK允許我無誤地繼續。

現在SQLServer將此FK標記爲「不可信」,MSDN表示通過檢查所有約束來重新啓用查詢優化器。那麼爲什麼即使有些國家有一個無效的國家代碼,下面這行也不會給我一個錯誤?

ALTER TABLE States 
     CHECK CONSTRAINT ALL 
GO 

我認爲這應該會引發錯誤。

回答

17

爲了讓約束再次得到信任,您需要使用這種語法,這種語法的確看起來有點奇怪。 WITH CHECK是導致現有數據驗證的原因。

ALTER TABLE States 
     WITH CHECK CHECK CONSTRAINT ALL 
GO 

和以前一樣,這將拋出一個錯誤,直到您解析具有錯誤的CountryID值的狀態。

+0

完美,謝謝!將在9分鐘內標記答案 – parliament