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