Share via


建立與修改 CHECK 條件約束

建立資料表時,您可以建立 CHECK 條件約束作為資料表定義的一部分。如果資料表已經存在,您可以加入 CHECK 條件約束。資料表和資料行可以包含多個 CHECK 條件約束。

如果 CHECK 條件約束已經存在,您可以修改或刪除它。例如,您可能想要修改資料表資料行中 CHECK 條件約束所使用的運算式。

[!附註]

若要修改 CHECK 條件約束,您必須先刪除現有的 CHECK 條件約束,然後以新的定義重新建立。

下列 Transact-SQL 範例會建立新的資料表,然後將 CHECK 條件約束加入 CreditRating 資料行以修改資料表。

IF OBJECT_ID ('dbo.Vendors', 'U') IS NOT NULL
DROP TABLE dbo.Vendors;
GO
CREATE TABLE dbo.Vendors 
    (VendorID int PRIMARY KEY, VendorName nvarchar (50), 
    CreditRating tinyint)
GO
ALTER TABLE dbo.Vendors ADD CONSTRAINT CK_Vendor_CreditRating
    CHECK (CreditRating >= 1 AND CreditRating <= 5)

刪除 CHECK 條件約束,以移除條件約束運算式所包含的一或多個資料行可接受的資料值限制。

若要在建立資料表時建立 CHECK 條件約束

若要在現有資料表建立 CHECK 條件約束

若要刪除 CHECK 條件約束

使用 WITH NOCHECK 強制執行 CHECK 條件約束

當您將 CHECK 條件約束加入現有的資料表時,CHECK 條件約束可以只套用至新的資料,也可以套用至現有的資料。依預設,CHECK 條件約束會同時套用到現有的資料以及所有新資料。使用 ALTER TABLE 陳述式的 WITH NOCHECK 選項,可將新的條件約束只套用到新加入的資料。當現有資料已符合新的 CHECK 條件約束,或商務規則要求從這一點開始才強制執行條件約束時,這個選項會很有用。

例如,原有的條件約束可能要求郵遞區號限制為五位數,但新的條件約束要求郵遞區號為九位數。原本五位數的郵遞區號仍然有效,並與包含九位數郵遞區號的新資料並存。因此只有新的資料需要根據新的條件約束進行檢查。

但如果在加入條件約束時沒有檢查現有的資料,您應該要特別小心,因為這會略過 Database Engine 中強制執行資料表完整性規則的控制。

若要在建立 CHECK 條件約束時不檢查現有的資料

停用 CHECK 條件約束

您可以針對特定作業 (如 INSERT 作業、UPDATE 作業以及複寫處理) 停用現有的 CHECK 條件約束。

  • INSERT 與 UPDATE 陳述式

    停用 CHECK 條件約束可讓您修改資料表中的資料,但條件約束不會驗證資料。如果新資料會違反條件約束,或條件約束只需套用到資料庫中的現有資料,就可以在執行 INSERT 和 UPDATE 陳述式時停用 CHECK 條件約束。

  • 複寫處理

    如果是來源資料庫所專屬的條件約束,在複寫過程中就可停用 CHECK 條件約束。複寫資料表時,會從來源資料庫將資料表定義和資料複製到目的地資料庫。這兩個資料庫通常 (但不是必要) 位於不同的伺服器上。如果未停用來源資料庫所專屬的 CHECK 條件約束,這些條件約束可能會無謂的禁止在目的資料庫輸入新資料。如需詳細資訊,請參閱<使用 NOT FOR REPLICATION 控制條件約束、識別和觸發程序>。

若要停用 INSERT 和 UPDATE 陳述式的 CHECK 條件約束

若要停用複寫的 CHECK 條件約束

若要取得有關 CHECK 條件約束的詳細資訊

請參閱

概念