FOREIGN KEY 制約

外部キー (FK) は、2 つのテーブルのデータ間にリンクを確立および設定するために使用される単一の列または複数の列の組み合わせです。テーブルを作成または変更するときに FOREIGN KEY 制約を定義することにより、外部キーを作成できます。

外部キー参照では、1 つのテーブルの主キー値が格納されている列が別のテーブルの 1 つ以上の列によって参照されたときに、2 つのテーブル間にリンクが作成されます。この列は、2 番目のテーブルの外部キーになります。

たとえば、AdventureWorks2008R2 データベースの Sales.SalesOrderHeader テーブルには、Sales.SalesPerson テーブルへのリンクが含まれています。これは、販売注文と販売員の間に論理リレーションシップが存在するからです。SalesOrderHeader テーブルの SalesPersonID 列は、SalesPerson テーブルの主キー列と一致します。また、SalesOrderHeader テーブルの SalesPersonID 列は、SalesPerson テーブルに対する外部キーです。

SalesOrderHeader.SalesPersonID を外部キーとして使用

FOREIGN KEY 制約からリンクを設定できるのは、別のテーブルの PRIMARY KEY 制約だけではありません。別のテーブルの UNIQUE 制約が定義された列を参照するように定義することもできます。FOREIGN KEY 制約には NULL 値を含めることができます。ただし、複合 FOREIGN KEY 制約が定義されたいずれかの列に NULL 値が含まれている場合は、FOREIGN KEY 制約を構成するすべての値の検証がスキップされます。複合 FOREIGN KEY 制約のすべての値が検証されるようにするには、参加しているすべての列に NOT NULL を指定します。

注意

FOREIGN KEY 制約からは、同じデータベース内のテーブルの列や、同じテーブルの列を参照できます。これらを自己参照テーブルといいます。たとえば、employee_numberemployee_name、および manager_employee_number という 3 つの列を含む従業員テーブルがあるとします。マネージャも従業員なので、manager_employee_number 列から employee_number 列への外部キー リレーションシップが存在します。

参照整合性

FOREIGN KEY 制約の主な目的は、外部キー テーブルに格納できるデータを制御することですが、主キー テーブルのデータに対する変更も制御されます。たとえば、ある販売員の行が Sales.SalesPerson テーブルから削除され、その販売員の ID が Sales.SalesOrderHeader テーブルの販売注文に使用された場合、2 つのテーブル間の参照整合性は破棄されます。削除された販売員の販売注文は、SalesPerson テーブルのデータへのリンクを持たない状態となり、SalesOrderHeader テーブル内で孤立します。

FOREIGN KEY 制約を定義すると、このような状況が発生するのを防ぐことができます。この制約により、外部キー テーブルのデータへのリンクが無効になるような変更を主キー テーブルのデータに加えることができなくなるため、参照整合性が保証されます。主キー テーブルの行を削除しようとするか、または主キー値を変更しようとした場合、削除または変更する主キー値が別のテーブルの FOREIGN KEY 制約の値と一致していると、その操作は失敗します。FOREIGN KEY 制約が定義された行を正常に変更または削除するには、まず、外部キー テーブルの外部キー データを削除または変更し、外部キーから他の主キー データへのリンクを設定する必要があります。

FOREIGN KEY 制約のインデックス作成

外部キーにインデックスを作成する利点は、次のとおりです。

  • PRIMARY KEY 制約に加えた変更が、関連テーブルの FOREIGN KEY 制約によってチェックされます。

  • クエリ内で、一方のテーブルの FOREIGN KEY 制約が定義された列を、他方のテーブルの主キー列または一意なキー列と照合することによって関連テーブルのデータが結合されるとき、多くの場合、外部キー列が結合基準に使用されます。インデックスを使用すると、データベース エンジンにより、外部キー テーブルの関連データがすばやく検索されます。ただし、必ずしもこのインデックスを作成する必要はありません。2 つのテーブル間に PRIMARY KEY 制約または FOREIGN KEY 制約が定義されていなくても、関連する 2 つのテーブルのデータを結合できます。ただし、2 つのテーブル間に外部キー リレーションシップが存在するということは、それら 2 つのテーブルが、結合基準としてキーを使用するクエリ内で結合されるように最適化されていることを示します。結合での FOREIGN KEY 制約の使用の詳細については、「結合の基礎」および「クエリの種類とインデックス」を参照してください。

テーブル内の FOREIGN KEY 制約の数

SQL Server には、テーブルに格納できる (他のテーブルを参照する) FOREIGN KEY 制約の数、または他のテーブルによって所有されている、特定のテーブルを参照する FOREIGN KEY 制約の数に関して、あらかじめ決められた制限がありません。それにもかかわらず、FOREIGN KEY 制約の実際の数は、使用しているハードウェアの構成と、使用しているデータベースおよびアプリケーションのデザインによって制限されます。テーブルには 253 個を超える FOREIGN KEY 制約を格納しないようにし、そのテーブルが 253 個を超える FOREIGN KEY 制約によって参照されないようにすることをお勧めします。データベースとアプリケーションをデザインするときは、FOREIGN KEY 制約を適用した場合のコストを考慮してください。