Tôi nhìn vào cơ sở dữ liệu mẫu AdventureWorks cho SQL Server 2008, và tôi thấy trong kịch bản sáng tạo của họ rằng họ có xu hướng sử dụng như sau:WITH CHECK ADD CONSTRAINT tiếp theo ràng buộc kiểm tra vs Thanh CONSTRAINT
ALTER TABLE [Production].[ProductCostHistory] WITH CHECK ADD
CONSTRAINT [FK_ProductCostHistory_Product_ProductID] FOREIGN KEY([ProductID])
REFERENCES [Production].[Product] ([ProductID])
GO
ngay sau đó:
ALTER TABLE [Production].[ProductCostHistory] CHECK CONSTRAINT
[FK_ProductCostHistory_Product_ProductID]
GO
tôi thấy điều này cho các phím nước ngoài (như ở đây), ràng buộc duy nhất và thường xuyên CHECK
hạn chế; DEFAULT
hạn chế sử dụng định dạng thường xuyên Tôi quen thuộc hơn với ví dụ như:
ALTER TABLE [Production].[ProductCostHistory] ADD CONSTRAINT
[DF_ProductCostHistory_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]
GO
sự khác biệt là gì, nếu có, giữa làm nó theo cách đầu tiên so với thứ hai?
Không giống như KIỂM TRA thực sự là mặc định, nó chỉ là mặc định cho dữ liệu mới. Từ http://msdn.microsoft.com/en-us/library/ms190273.aspx: "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." –
@ZainRizvi: không phải dữ liệu mới, những hạn chế mới. Nếu bạn vô hiệu hóa một ràng buộc với 'ALTER TABLE foo NOCHECK CONSTRAINT fk_b' và sau đó kích hoạt lại nó với' ALTER TABLE foo CHECK CONSTRAINT fk_b', nó không kiểm tra ràng buộc. 'ALTER TABLE foo VỚI KIỂM TRA KIỂM TRA KIỂM TRA fk_b' là cần thiết để xác minh dữ liệu. – jmoreno
Ban đầu tôi không đọc rõ điều này. Dòng thứ hai (dư thừa), là hàm để bật ràng buộc. Vì ràng buộc được bật theo mặc định, dòng thứ hai là thừa. – blindguy