Sql-Server-2008

更改表檢查約束

  • January 21, 2020

在 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 有一篇非常好的部落格文章詳細解釋了它:你能相信你的約束嗎

引用自:https://dba.stackexchange.com/questions/24297