外部キーのリレーションシップの作成

適用対象: SQL Server 2016 (13.x) 以降 Azure SQL DatabaseAzure SQL Managed Instance

この記事では、SQL Server Management Studio または Transact-SQL を使用して、SQL Server で外部キーのリレーションシップを作成する方法について説明します。 あるテーブルの行と他のテーブルの行を関連付ける場合は、2 つのテーブル間にリレーションシップを作成します。

アクセス許可

外部キーが設定された、新しいテーブルを作成するには、データベースの CREATE TABLE 権限と、テーブルを作成するスキーマの ALTER 権限が必要です。

既存のテーブルに外部キーを作成するには、テーブルに対する ALTER 権限が必要です。

制限事項と制約事項

  • 外部キー制約は、別のテーブルの主キー制約にのみリンクする必要はありません。 外部キーは、別のテーブルの UNIQUE 制約の列を参照するように定義することもできます。

  • FOREIGN KEY 制約の列に NULL 以外の値を入力するときは、その値が参照される列に存在している必要があります。 それ以外の場合、外部キー違反のエラー メッセージが返されます。 複合外部キー制約のすべての値が検証されるようにするには、参加しているすべての列に NOT NULL を指定します。

  • FOREIGN KEY 制約は、同じサーバー上の同じデータベース内のテーブルのみを参照できます。 複数のデータベースにまたがる参照整合性は、トリガーを使って実装する必要があります。 詳細については、CREATE TRIGGER に関するページをご覧ください。

  • FOREIGN KEY 制約は、同じテーブル内の他の列を参照でき、自己参照として参照されます。

  • 列レベルで指定された FOREIGN KEY 制約は、参照列を 1 つだけ表示できます。 この参照列は、制約が定義されている列と同じデータ型である必要があります。

  • テーブルレベルで指定された FOREIGN KEY 制約は、制約列リスト内の列の数と同じ数の参照列を持っている必要があります。 また、各参照列のデータ型は、列リスト内の、参照列に対応する列と同じでなければなりません。

  • データベース エンジンには、他のテーブルを参照するテーブルに含めることができる FOREIGN KEY 制約の数に対して定義済みの制限はありません。 データベース エンジンでは、特定のテーブルを参照する他のテーブルが所有する FOREIGN KEY 制約の数も制限されません。 ただし、使用できる FOREIGN KEY 制約の実際の数は、ハードウェア構成やデータベースおよびアプリケーションのデザインにより制限されます。 テーブルから、他のテーブルと列を最大 253 個まで外部キーとして参照 (発信参照) することができます。 SQL Server 2016 (13.x) 以降では、1 つのテーブル内の列を参照 (着信参照) できる他のテーブルと列の数が 253 から 10,000 までに限られています。 (少なくとも 130 の互換性レベルが必要です)。増加には、次の制限があります。

    • 253 を超える外部キー参照は、DELETE と UPDATE DML 操作でのみサポートされています。 MERGE 操作はサポートされません。
    • テーブル自体に対する外部キー参照も、253 の外部キー参照に制限されます。
    • 現在、253 を超える外部キー参照は、列ストア インデックス、メモリ最適化テーブル、Stretch Database、では使用できません。

    重要

    Stretch Database は、SQL Server 2022 (16.x) および Azure SQL Database で非推奨になります。 この機能は、データベース エンジンの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。

  • FOREIGN KEY 制約は一時テーブルには設定されません。

  • CLR ユーザー定義型の列に対して外部キーを定義する場合は、型の実装でバイナリ順がサポートされている必要があります。 詳細については、「 CLR ユーザー定義型」を参照してください。

  • varchar(max) 型の列は、その列が参照する主キーも varchar(max)型として定義されている場合にのみ FOREIGN KEY 制約で使用できます。

テーブル デザイナーで外部キー リレーションシップを作成する

SQL Server Management Studio を使用する

  1. オブジェクト エクスプローラーで、リレーションシップの外部キー側となるテーブルを右クリックして、[デザイン] を選択します。

    [テーブル デザイナー] にテーブルが表示されます。

  2. [テーブル デザイナー] メニューの [リレーションシップ] を選択します。 (ヘッダーの [テーブル デザイナー] メニューを参照するか、テーブル定義の空の領域を右クリックし、[リレーションシップ] を選択します)。

  3. [外部キーのリレーションシップ] ダイアログ ボックスで、[追加] を選択します。

    リレーションシップが [選択されたリレーションシップ] の一覧に、FK_<tablename>_<tablename> という形式のシステム提供の名前で表示されます。ここで、最初の tablename は外部キー テーブルの名前で、2 番目の tablename は主キー テーブルの名前です。 これは、単純に、外部キーオブジェクトの (Name) フィールドの既定かつ一般的な名前付け規則です。

  4. [選択されたリレーションシップ] ボックスの一覧で、リレーションシップを選択します。

  5. 右側のグリッドの [テーブルと列の指定] を選択し、その右側にある省略記号 [...] を選択します。

  6. [テーブルと列] ダイアログ ボックスの [主キー] ボックスの一覧で、リレーションシップの主キー側となるテーブルをクリックします。

  7. 下のグリッドで、テーブルの主キーになる列を選択します。 各列の右横のグリッド セルで、外部キー テーブルの対応する外部キー列を選択します。

    リレーションシップの名前は、テーブル デザイナー によって割り当てられます。 この名前を変更するには、 [リレーションシップ名] ボックスの内容を編集します。

  8. [OK] をクリックしてリレーションシップを作成します。

  9. テーブル デザイナー ウィンドウを閉じ、変更を [保存] して外部キー リレーションシップの変更を有効にします。

新しいテーブルに外部キーを作成する

Transact-SQL の使用

次の例では、AdventureWorks データベースで、テーブルを作成し、Sales.SalesReason テーブルの SalesReasonID 列を参照する外部キー制約を TempID 列で定義します。 ON DELETE CASCADE 句および ON UPDATE CASCADE 句を使用することによって、Sales.SalesReason テーブルに対する変更が自動的に Sales.TempSalesReason テーブルにも反映されるようにしています。

CREATE TABLE Sales.TempSalesReason 
   (
      TempID int NOT NULL, Name nvarchar(50)
      , CONSTRAINT PK_TempSales PRIMARY KEY NONCLUSTERED (TempID)
      , CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
        REFERENCES Sales.SalesReason (SalesReasonID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
   )
;

既存のテーブルに外部キーを作成する

Transact-SQL の使用

次の例では、AdventureWorks データベースの TempID 列に外部キーを作成し、Sales.SalesReason テーブルの SalesReasonID 列を参照します。

ALTER TABLE Sales.TempSalesReason
   ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
      REFERENCES Sales.SalesReason (SalesReasonID)
      ON DELETE CASCADE
      ON UPDATE CASCADE
;

次のステップ