SQL Serverで外部キー制約を無効にする必要がある場合は、Transact-SQLを使用して無効にする方法を次に示します。
これにより、外部キーに制限されることなくデータを入力できるようになります。明らかに、そうする非常に正当な理由がない限り、これを行うことはありません。外部キーは参照整合性を強制するため、それらを無効にすると、あらゆる種類の問題が発生する可能性があります。
例1-外部キー制約を無効にする
外部キー制約を無効にするには、NOCHECK
を使用します ALTER TABLE
内の引数 ステートメント。
このように:
ALTER TABLE BandMember NOCHECK CONSTRAINT FK_BandMember_Musician;
このコードは、 FK_BandMember_Musician と呼ばれる外部キー制約を無効にします 。
例2–制約を確認する
sys.foreign_keys
にクエリを実行できます 制約が無効になっていることを確認するためのシステムビュー:
SELECT name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys;
結果:
+--------------------------------+---------------+------------------+ | Constraint | is_disabled | is_not_trusted | |--------------------------------+---------------+------------------| | FK_BandMember_Band | 0 | 0 | | FK_BandMember_Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | 0 | 0 | +--------------------------------+---------------+------------------+
この場合、現在のデータベースからすべての外部キー制約を選択しました。
無効になっているのはこれだけであることがわかります( is_disabled のため) 列が 1 に設定されている 。
is_not_trusted に気付くかもしれません 列も 1 に設定されます 。これは、制約がシステムによって検証されていないことを示しています。
制約がすべてのデータをチェックしたとはもはや想定できないため、これは理にかなっています。制約が無効になっているという事実は、データが制約によってチェックされることなくデータベースに入ることができることを意味します。したがって、データベースに無効なデータが存在する可能性があります。
制約を再度有効にする必要がある場合は、(WITH CHECK
を使用して、制約の信頼を復元する機会があります。 オプション)。これにより、制約を有効にする前に既存のすべての行がチェックされます。
しないオプションもあります 既存のデータをチェックしますが、これはまれなケースでのみ実行する必要があります。
これも同じクエリですが、テーブルと参照されるテーブルを表示するための追加の列がいくつかあります。
SELECT name AS 'Constraint', OBJECT_NAME(parent_object_id) AS 'Table', OBJECT_NAME(referenced_object_id) AS 'Referenced Table', is_disabled, is_not_trusted FROM sys.foreign_keys;
結果:
+--------------------------------+------------------+---------------------+---------------+------------------+ | Constraint | Table | Referenced Table | is_disabled | is_not_trusted | |--------------------------------+------------------+---------------------+---------------+------------------| | FK_BandMember_Band | BandMember | Band | 0 | 0 | | FK_BandMember_Musician | BandMember | Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember | 0 | 0 | +--------------------------------+------------------+---------------------+---------------+------------------+