建立與修改 FOREIGN KEY 條件約束

當您建立資料表時,可以建立 FOREIGN KEY 條件約束作為資料表定義的一部份。如果已經存在資料表,您可以加入 FOREIGN KEY 條件約束,前提是 FOREIGN KEY 條件約束已連結到其他或相同資料表中現有的 PRIMARY KEY 條件約束或 UNIQUE 條件約束。資料表可包含多個 FOREIGN KEY 條件約束。

如果已經存在 FOREIGN KEY 條件約束,您可以修改或刪除它。例如,您可能想要資料表的 FOREIGN KEY 條件約束可以參考其他資料行。但是,您無法變更已使用 FOREIGN KEY 條件約束定義的資料行長度。

[!附註]

若要修改 FOREIGN KEY 條件約束,您必須先刪除現有的 FOREIGN KEY 條件約束,然後使用新的定義來重新建立。

刪除 FOREIGN KEY 條件約束,可移除外部索引鍵資料行與其他資料表中相關的主索引鍵 (或是 UNIQUE 條件約束) 資料行之間的參考完整性需求。

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

CREATE TABLE (Transact-SQL)

若要在現有的資料表中建立 FOREIGN KEY 條件約束

ALTER TABLE (Transact-SQL)

如何:建立資料表之間的關聯性 (Visual Database Tools)

若要刪除 FOREIGN KEY 條件約束

ALTER TABLE (Transact-SQL)

使用 WITH NOCHECK 來強制執行 FOREIGN KEY 條件約束

當您將 FOREIGN KEY 條件約束加入資料表內現有的一或多個資料行時,Database Engine 預設會檢查資料行中的現有資料,以確保所有值 (除了 NULL 以外) 都存在於所參考的 PRIMARY KEY 或 UNIQUE 條件約束的資料行中。不過,透過指定 WITH NOCHECK,Database Engine 可避免針對新的條件約束檢查資料行內的資料,並且不管資料行內的資料為何均加入新的條件約束。當現有資料已符合新 FOREIGN KEY 條件約束時,或商務規則要求從此點開始才強制執行條件約束時,WITH NOCHECK 選項相當有用。

不過,在加入條件約束而不檢查現有資料時要特別小心,因為這會略過 Database Engine 中強制執行資料表資料完整性的控制項。

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

ALTER TABLE (Transact-SQL)

停用 FOREIGN KEY 條件約束

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

  • INSERT 與 UPDATE 陳述式

    停用 FOREIGN KEY 條件約束,就可以直接修改資料表中的資料,而不需經過條件約束的驗證。如果新的資料將會違反條件約束,或條件約束只需套用至資料庫內的現有資料,那麼可在執行 INSERT 和 UPDATE 陳述式時關閉 FOREIGN KEY 條件約束。

    [!附註]

    任何在相關主索引鍵上定義的串聯式動作,都不會在包含已停用外部索引鍵的資料列上執行。

  • 複寫處理

    如果是來源資料庫專屬的條件約束,在複寫過程中就可關閉 FOREIGN KEY 條件約束。在複寫資料表時,資料表定義和資料會從來源資料庫複製到目的地資料庫。如果 FOREIGN KEY 條件約束是來源資料庫專屬的條件約束,可是並未在複寫時關閉,它們將會禁止新的資料輸入目的地資料庫內,但這是沒有必要的。如需詳細資訊,請參閱<使用 NOT FOR REPLICATION 控制條件約束、識別和觸發程序>。

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

ALTER TABLE (Transact-SQL)

如何:使用 INSERT 和 UPDATE 陳述式停用外部索引鍵條件約束 (Visual Database Tools)

若要停用複寫的 FOREIGN KEY 條件約束

ALTER TABLE (Transact-SQL)

如何:停用複寫的外部索引鍵條件約束 (Visual Database Tools)

若要取得有關 FOREIGN KEY 條件約束的資訊

sys.foreign_keys (Transact-SQL)

若要取得有關組成 FOREIGN KEY 條件約束之資料行的資訊

sys.foreign_key_columns (Transact-SQL)

請參閱

概念