Sql-Server-2008
更改表檢查約束
在 SQL Server 的對象資源管理器中,當選擇外鍵約束並編寫腳本時,會生成以下程式碼。
USE [MyTestDatabase] GO ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID]) REFERENCES [dbo].[T1] ([T1ID]) GO ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1] GO
最後一條語句“ALTER TABLE CHECK CONSTRAINT”的目的是什麼?它是否執行似乎並不重要。它不會在現有的錯誤數據上失敗,也不會改變將在新數據上強制執行的約束。
謝謝!
它確保約束在創建後啟用。您的
ALTER TABLE
聲明包括WITH NOCHECK
哪一段說在創建約束期間不檢查現有的錯誤數據。
WITH NOCHECK
如所寫,由於第一條語句中的 ,現有數據將不會根據約束進行檢查。發出第二條語句將啟用對約束的檢查,以檢查約束所涵蓋的表的任何未來更改,直到ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1]
發出 an 為止。所寫的語句基本上是在說“創建此外鍵約束,但不要根據現有數據對其進行檢查。使其對任何即將發生的數據更改都處於活動狀態。”
您的第一條語句創建了一個禁用的約束。它需要啟用並可能受到信任。以下奇怪的語法將確保您的約束已啟用並受信任:
ALTER TABLE YourTable WITH CHECK CHECK CONSTRAINT YourConstraint;
Hugo Kornelis 有一篇非常好的部落格文章詳細解釋了它:你能相信你的約束嗎