2012-08-31 41 views
15

Tôi có một SQL Server 2012 db với một ràng buộc khoá ngoại tham chiếu Countries.CountryID = States.CountryIDSQL KHÔNG KIỂM TRA KEY NƯỚC NGOÀI sau khi số liệu, tái tạo điều kiện truy vấn tối ưu hóa

tôi cần để tái tạo Countries bảng để tôi thả KEY NƯỚC NGOÀI này từ States bảng (nếu không nó sẽ không cho phép tôi để thả nước)

Sau khi tôi làm điều đó, tôi muốn tái tạo FK trên States nhưng nó không cho phép tôi trừ khi tôi chỉ định NO CHECK như vậy:

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

Tôi đã không nhận ra lúc đầu rằng một số hàng của các quốc gia có CountryID không có bản ghi phù hợp với Countries.CountryID. Rõ ràng là WITH NOCHECK cho phép tôi tiếp tục mà không có lỗi.

Bây giờ SQLServer có đánh dấu FK này là "không đáng tin cậy", MSDN nói để kích hoạt lại trình tối ưu hóa truy vấn bằng cách kiểm tra tất cả các ràng buộc. Vậy tại sao dòng sau không cho tôi một lỗi mặc dù một số quốc gia có một CountryID không hợp lệ?

ALTER TABLE States 
     CHECK CONSTRAINT ALL 
GO 

Tôi nghĩ điều này đáng ra phải có lỗi.

Trả lời

17

Để làm cho các ràng buộc được tin cậy một lần nữa, bạn cần phải sử dụng cú pháp này, điều này có vẻ hơi lạ. Các WITH CHECK là những gì gây ra việc xác nhận dữ liệu hiện có.

ALTER TABLE States 
     WITH CHECK CHECK CONSTRAINT ALL 
GO 

Như trước đây, điều này sẽ gây ra lỗi cho đến khi bạn giải quyết các quốc gia có giá trị CountryID không hợp lệ.

+0

Hoàn hảo, cảm ơn! sẽ đánh dấu câu trả lời sau 9 phút – parliament

Các vấn đề liên quan