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

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

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

アクセス許可

外部キーを使用して新しいテーブルを作成するには、データベースで CREATE TABLE のアクセス許可と、テーブルを作成するスキーマの ALTER SCHEMA のアクセス許可が必要です。

既存のテーブルに外部キーを作成するには、テーブルに ALTER TABLE のアクセス許可が必要です。

制限事項

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

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

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

  • 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 を超える外部キー参照は、DELETEUPDATE DML 操作にサポートされています。 MERGE 操作はサポートされていません。

    • テーブル自体に対する外部キー参照も、253 の外部キー参照に制限されます。

    • 現在、253 を超える外部キー参照は列ストア インデックスまたはメモリ最適化テーブルに利用できません。

  • 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;