次の方法で共有


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

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

このトピックの内容

  • 作業を開始する準備:

    制限事項と制約事項

    セキュリティ

  • 以下を使用して外部キー リレーションシップを作成するには:

    SQL Server Management Studio

    Transact-SQL

作業を開始する準備

制限事項と制約事項

  • 外部キー制約からリンクを設定できるのは、別のテーブルの主キー制約だけではありません。別のテーブルの UNIQUE 制約が定義された列を参照するように定義することもできます。

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

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

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

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

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

  • データベース エンジンには、他のテーブルを参照するテーブルに含めることができる FOREIGN KEY 制約の数についても、特定のテーブルを参照する他のテーブルが持つ FOREIGN KEY 制約の数についても、事前定義済みの制限はありません。 ただし、使用できる FOREIGN KEY 制約の実際の数は、ハードウェア構成やデータベースおよびアプリケーションのデザインにより制限されます。 1 つのテーブルに含める FOREIGN KEY 制約は 253 個までとし、253 個以内の FOREIGN KEY 制約から参照することをお勧めします。

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

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

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

セキュリティ

権限

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

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

[トップに戻る] リンクで使用される矢印アイコン[Top]

SQL Server Management Studio の使用

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

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

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

  2. [テーブル デザイナー] メニューの [リレーションシップ] をクリックします。

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

    リレーションシップが [選択されたリレーションシップ] ボックスに表示されます。このリレーションシップには、FK_<tablename>_<tablename> (tablename は外部キー テーブルの名前) という形式の名前が自動的に割り当てられます。

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

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

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

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

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

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

[トップに戻る] リンクで使用される矢印アイコン[Top]

Transact-SQL の使用

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

  1. オブジェクト エクスプローラーで、データベース エンジンのインスタンスに接続します。

  2. [標準] ツール バーの [新しいクエリ] をクリックします。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、[実行] をクリックします。 この例では、テーブルを作成し、Sales.SalesReason テーブル内の SalesReasonID 列を参照する外部キー制約を TempID 列に定義します。 ON DELETE CASCADE 句および ON UPDATE CASCADE 句を使用することによって、Sales.SalesReason テーブルに対する変更が自動的に Sales.TempSalesReason テーブルにも反映されるようにしています。

    USE AdventureWorks2012;
    GO
    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
    );GO
    

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

  1. オブジェクト エクスプローラーで、データベース エンジンのインスタンスに接続します。

  2. [標準] ツール バーの [新しいクエリ] をクリックします。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、[実行] をクリックします。 この例では、TempID 列に外部キーを作成し、Sales.SalesReason テーブルの SalesReasonID 列を参照します。

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

    詳細については、「ALTER TABLE (Transact-SQL)」、「CREATE TABLE (Transact-SQL)」、および「table_constraint (Transact-SQL)」を参照してください。

[トップに戻る] リンクで使用される矢印アイコン[Top]