2012-04-02 25 views
20

Nếu tôi kịch bản một bảng với một chìa khóa nước ngoài, nó trông như thế này:ALTER TABLE [dbo] [MyTable] KIỂM TRA CONSTRAINT [FK_MyTable_SomeCol]

GO 
ALTER TABLE [dbo].[MyTable] WITH CHECK ADD CONSTRAINT [FK_MyTable_SomeCol] FOREIGN KEY([SomeCol]) 
REFERENCES [dbo].[MyOtherTable] ([SomeCol]) 
GO 
ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol] 
GO 

phần thứ hai cho (ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol]) là gì?

+0

Tôi không thấy câu lệnh thứ hai khi tôi viết một bảng có khóa ngoài (SQL Server 2008 R2). Bạn có chắc đầu tiên không chứa ** 'WITH NOCHECK' ** thay vì' WITH CHECK'? –

+0

Yep nó là WITH NOCHECK. Bây giờ chức năng của nó rõ ràng hơn với tôi. Cảm ơn tất cả! – yonexbat

Trả lời

19

Đó là một tạo tác của cách ràng buộc được viết - mặc dù không cần thiết để chỉ định các tùy chọn này (vì chúng là mặc định cho các ràng buộc mới), cùng một trình tạo cũng có thể tạo ra các tùy chọn NOCHECK theo cách giống hệt nhau.

Documentation cho ALTER TABLE chỉ ra hai mục đích sử dụng riêng biệt của CHECK/NOCHECK:

WITH CHECK | WITH NOCHECK

Chỉ định liệu các dữ liệu trong bảng là hoặc không được xác nhận đối với một mới được bổ sung hoặc tái kích hoạt FOREIGN KEY hoặc CHECK hạn chế. Nếu không được chỉ định, WITH CHECK được giả định cho các ràng buộc mới và WITH NOCHECK được giả định cho các ràng buộc được kích hoạt lại.

Và:

{ CHECK | NOCHECK } CONSTRAINT

Chỉ định rằng constraint_name được kích hoạt hay vô hiệu hóa.

Vì vậy, một tùy chọn cho biết "kiểm tra nội dung hiện tại của bảng", tùy chọn còn lại là "Xác thực dữ liệu mới khi được thêm".

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