FOREIGN KEY 制約の作成と変更
FOREIGN KEY 制約は、テーブルを作成するときに、テーブルの定義の一部として作成できます。テーブルが既に存在する場合、別のテーブルまたは同じテーブル内の既存の PRIMARY KEY 制約または UNIQUE 制約にリンクされている FOREIGN KEY 制約であれば、そのテーブルに追加できます。個々のテーブルには複数の FOREIGN KEY 制約を含めることができます。
既存の FOREIGN KEY 制約を変更または削除することもできます。たとえば、テーブルの FOREIGN KEY 制約が他の列を参照するように変更できます。ただし、FOREIGN KEY 制約で定義されている列の長さを変更することはできません。
注 |
---|
FOREIGN KEY 制約を変更するには、まず既存の FOREIGN KEY 制約を削除してから、新しい定義を使用して再作成する必要があります。 |
FOREIGN KEY 制約を削除すると、この外部キー列と他のテーブル内の関連する主キー列または UNIQUE 制約列の間で設定されていた参照整合性の要件が削除されます。
テーブルの作成時に FOREIGN KEY 制約を作成するには
既存のテーブルに FOREIGN KEY 制約を作成するには
テーブル間にリレーションシップを作成する方法 (Visual Database Tools)
FOREIGN KEY 制約を削除するには
WITH NOCHECK を使用した FOREIGN KEY 制約の強制
既定では、FOREIGN KEY 制約がテーブル内の既存の列に追加されると、データベース エンジンが列内の既存データを調べ、NULL 以外の値がすべて、参照先の PRIMARY KEY 制約または UNIQUE 制約の列に存在する値であることを確認します。ただし、WITH NOCHECK を指定すると、列のデータを新しい制約と照合せず、列のデータに関係なく新しい制約を作成するようにデータベース エンジンに指示することができます。WITH NOCHECK オプションは、既存のデータが新しい FOREIGN KEY 制約の条件を既に満たしている場合、またはビジネス ルールにより、その時点から新しく制約を適用する必要がある場合に役に立ちます。
ただし、既存のデータをチェックせずに制約を追加すると、テーブルのデータ整合性を維持するデータベース エンジンによる制御がバイパスされるので、注意する必要があります。
FOREIGN KEY 制約の作成時に既存データのチェックを回避するには
FOREIGN KEY 制約の無効化
INSERT 操作、UPDATE 操作、レプリケーション処理などの特定の操作に対して、既存の FOREIGN KEY 制約を無効にすることができます。
INSERT ステートメントと UPDATE ステートメント
FOREIGN KEY 制約を無効にすると、その制約による検証を行わずにテーブル内のデータを変更できるようになります。新しいデータが制約に違反することが予想される場合や、データベース内の既存のデータにのみ制約を適用する場合、INSERT ステートメントと UPDATE ステートメントの実行中は FOREIGN KEY 制約を無効にしておきます。
注 無効にした外部キーを含む行では、関連する主キーで定義された連鎖操作は実行されません。
レプリケーション処理
FOREIGN KEY 制約がソース データベース固有の制約である場合、レプリケーション処理中はその制約を無効にしておきます。テーブルをレプリケートすると、テーブルの定義とデータは、ソース データベースからレプリケーション先データベースにコピーされます。FOREIGN KEY 制約がソース データベースに固有である場合、レプリケーション処理時に無効化されていないと、レプリケーション先データベースに新しいデータを入力できなくなることがあります。詳細については、「NOT FOR REPLICATION を使用した制約、ID、およびトリガの制御」を参照してください。
INSERT ステートメントと UPDATE ステートメントで FOREIGN KEY 制約を無効にするには
INSERT ステートメントまたは UPDATE ステートメントで外部キー制約を無効にする方法 (Visual Database Tools)
レプリケーション処理で FOREIGN KEY 制約を無効にするには
レプリケーションに対して外部キー制約を無効にする方法 (Visual Database Tools)
FOREIGN KEY 制約に関する情報を取得するには
sys.foreign_keys (Transact-SQL)
FOREIGN KEY 制約に含まれる列に関する情報を取得するには