外部キーのリレーションシップを作成する
適用対象: 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 を超える外部キー参照は、
DELETE
とUPDATE
DML 操作にサポートされています。MERGE
操作はサポートされていません。テーブル自体に対する外部キー参照も、253 の外部キー参照に制限されます。
現在、253 を超える外部キー参照は列ストア インデックスまたはメモリ最適化テーブルに利用できません。
FOREIGN KEY
制約は一時テーブルには実施されません。CLR ユーザー定義型の列に対して外部キーを定義する場合は、型の実装でバイナリ順がサポートされている必要があります。 詳細については、「 CLR ユーザー定義型」を参照してください。
varchar(max) 型の列は、参照する主キーが varchar(max) 型としても定義されている場合にのみ、
FOREIGN KEY
制約に使用できます。
テーブル デザイナーで外部キー リレーションシップを作成する
SQL Server Management Studio を使用します。
オブジェクト エクスプローラーで、リレーションシップの外部キー側となるテーブルを右クリックして、[デザイン] を選択します。
テーブルは [データベース テーブルの作成と更新] で開きます。
[テーブル デザイナー] メニューの [リレーションシップ] を選択します。 (ヘッダーの [テーブル デザイナー] メニューを参照するか、テーブル定義の空の領域を右クリックし、[リレーションシップ] を選択します)。
[外部キーのリレーションシップ] ダイアログ ボックスで、[追加] を選択します。
リレーションシップは、[選択されたリレーションシップ] で
FK_<tablename>_<tablename>
形式によるシステム提供の名前で表示されます。最初の tablename は外部キーテーブルの名前で、2 番目の tablename は主キーテーブルの名前です。 これは、外部キーオブジェクトの (Name) フィールドのデフォルトと一般的な名前付け規則に過ぎません。[選択されたリレーションシップ] ボックスの一覧で、リレーションシップを選択します。
右側のグリッドの [テーブルと列の指定] を選択し、その右側にある省略記号 [...] を選択します。
[テーブルと列] ダイアログ ボックスの [主キー] ドロップダウン リストで、リレーションシップの主キー側となるテーブルを選択します。
ダイアログ ボックスの下のグリッドで、テーブルの主キーを構成する列を選択します。 各列の右横のグリッド セルで、外部キー テーブルの対応する外部キー列を選択します。
リレーションシップの名前は、テーブル デザイナー によって割り当てられます。 この名前を変更するには、 [リレーションシップ名] ボックスの内容を編集します。
[OK] をクリックしてリレーションシップを作成します。
テーブル デザイナー ウィンドウを閉じ、変更を [保存] して外部キー リレーションシップの変更を有効にします。
新しいテーブルに外部キーを作成する
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;