主キー制約と外部キー制約Primary and Foreign Key Constraints

適用対象: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

主キーと外部キーは、 SQL ServerSQL Server テーブル内のデータに整合性を適用するために使用できる 2 種類の制約です。Primary keys and foreign keys are two types of constraints that can be used to enforce data integrity in SQL ServerSQL Server tables. これらは重要なデータベース オブジェクトです。These are important database objects.

このトピックの内容は次のとおりです。This topic contains the following sections.

主キー制約Primary Key Constraints

Foreign Key ConstraintsForeign Key Constraints

関連タスクRelated Tasks

主キー制約Primary Key Constraints

テーブルには通常、テーブルの各行を一意に識別する値が格納された単一の列または複数の列の組み合わせがあります。A table typically has a column or combination of columns that contain values that uniquely identify each row in the table. この列、または列の組み合わせを、テーブルの主キー (PK) と呼び、テーブルのエンティティが整合性を持つようにします。This column, or columns, is called the primary key (PK) of the table and enforces the entity integrity of the table. 主キー制約は一意なデータを保証するものであるため、通常は ID 列に対して定義されます。Because primary key constraints guarantee unique data, they are frequently defined on an identity column.

主キー制約をテーブルに対して指定すると、重複のないインデックスを データベース エンジンDatabase Engine が主キー列に対して自動的に作成し、データが一意になるようにします。When you specify a primary key constraint for a table, the データベース エンジンDatabase Engine enforces data uniqueness by automatically creating a unique index for the primary key columns. また、クエリの中で主キーが使用された場合は、このインデックスによってデータに高速にアクセスできます。This index also permits fast access to data when the primary key is used in queries. 複数の列に一意キー制約が定義されている場合は、1 つの列内で値が重複してもかまいませんが、一意キー制約が定義された列に格納される値の組み合わせは一意である必要があります。If a primary key constraint is defined on more than one column, values may be duplicated within one column, but each combination of values from all the columns in the primary key constraint definition must be unique.

次の図に示すように、このテーブルの複合主キー制約は、 Purchasing.ProductVendor テーブルの ProductID 列と VendorID 列により作成されています。As shown in the following illustration, the ProductID and VendorID columns in the Purchasing.ProductVendor table form a composite primary key constraint for this table. そのため、ProductIDVendorID の組み合わせは、ProductVendor テーブル内のすべての行で一意になります。This makes sure that every row in the ProductVendor table has a unique combination of ProductID and VendorID. これによって重複行の挿入が防止されます。This prevents the insertion of duplicate rows.

複合 PRIMARY KEY 制約Composite PRIMARY KEY constraint

  • テーブルに含めることができる主キー制約は 1 つだけです。A table can contain only one primary key constraint.

  • 主キーは 16 列を超えることはできず、また、主キーの長さの合計が 900 バイトを超えることはできません。A primary key cannot exceed 16 columns and a total key length of 900 bytes.

  • 主キー制約によって生成されたインデックスが含まれていても、テーブル上のインデックスの数を、非クラスター化インデックス 999 個、クラスター化インデックス 1 個より多くすることはできません。The index generated by a primary key constraint cannot cause the number of indexes on the table to exceed 999 nonclustered indexes and 1 clustered index.

  • 主キー制約に対して clustered も nonclustered も指定されていない場合、テーブルにクラスター化インデックスが指定されていなければ、clustered が使用されます。If clustered or nonclustered is not specified for a primary key constraint, clustered is used if there no clustered index on the table.

  • 主キー制約中で定義する列はすべて、not null として定義する必要があります。All columns defined within a primary key constraint must be defined as not null. NULL 値を許容するかどうかを指定しない場合、主キー制約の影響を受けるすべての列は not null に設定されます。If nullability is not specified, all columns participating in a primary key constraint have their nullability set to not null.

  • CLR ユーザー定義型の列に対して主キーを定義する場合は、型の実装でバイナリ順がサポートされている必要があります。If a primary key is defined on a CLR user-defined type column, the implementation of the type must support binary ordering.

Foreign Key ConstraintsForeign Key Constraints

外部キー (FK) は、2 つのテーブルのデータ間にリンクを確立および設定することによって外部キー テーブルに格納できるデータを制御するための単一の列または複数の列の組み合わせです。A foreign key (FK) is a column or combination of columns that is used to establish and enforce a link between the data in two tables to control the data that can be stored in the foreign key table. 外部キー参照では、1 つのテーブルの主キー値が格納されている列が別のテーブルの 1 つ以上の列によって参照されたときに、2 つのテーブル間にリンクが作成されます。In a foreign key reference, a link is created between two tables when the column or columns that hold the primary key value for one table are referenced by the column or columns in another table. この列は、2 番目のテーブルの外部キーになります。This column becomes a foreign key in the second table.

たとえば、 Sales.SalesOrderHeader テーブルには、 Sales.SalesPerson テーブルへの外部キー リンクが存在します。これは、販売注文と販売員の間に論理リレーションシップが存在するからです。For example, the Sales.SalesOrderHeader table has a foreign key link to the Sales.SalesPerson table because there is a logical relationship between sales orders and salespeople. SalesOrderHeader テーブルの SalesPersonID 列は、 SalesPerson テーブルの主キー列と一致します。The SalesPersonID column in the SalesOrderHeader table matches the primary key column of the SalesPerson table. また、 SalesOrderHeader テーブルの SalesPersonID 列は、 SalesPerson テーブルに対する外部キーです。The SalesPersonID column in the SalesOrderHeader table is the foreign key to the SalesPerson table. この外部キー リレーションシップを作成することによって、 SalesPerson テーブル内に存在しない SalesPersonID の値を SalesOrderHeader テーブルに挿入することはできなくなります。By creating this foreign key relationship, a value for SalesPersonID cannot be inserted into the SalesOrderHeader table if it does not already exist in the SalesPerson table.

テーブルから、他のテーブルと列を最大 253 個まで外部キーとして参照 (発信参照) することができます。A table can reference a maximum of 253 other tables and columns as foreign keys (outgoing references). SQL Server 2016 (13.x)SQL Server 2016 (13.x) では、1 つのテーブル内の列を参照 (着信参照) できる他のテーブルと列の数が 253 から 10,000 までに限られています。increases the limit for the number of other table and columns that can reference columns in a single table (incoming references), from 253 to 10,000. (少なくとも 130 の互換性レベルが必要です)。増加には、次の制限があります。(Requires at least 130 compatibility level.) The increase has the following restrictions:

  • 253 を超える外部キー参照は、DELETE DML 操作でのみサポートされています。Greater than 253 foreign key references are only supported for DELETE DML operations. UPDATE 操作と MERGE 操作ではサポートされません。UPDATE and MERGE operations are not supported.

  • テーブル自体に対する外部キー参照も、253 の外部キー参照に制限されます。A table with a foreign key reference to itself is still limited to 253 foreign key references.

  • 現在、253 を超える外部キー参照は、列ストア インデックス、メモリ最適化テーブル、Stretch Database、パーティション外部キー テーブルでは使用できません。Greater than 253 foreign key references are not currently available for columnstore indexes, memory-optimized tables, Stretch Database, or partitioned foreign key tables.

外部キー制約のインデックスIndexes on Foreign Key Constraints

主キー制約とは異なり、外部キー制約を作成しても対応するインデックスは自動的には作成されません。Unlike primary key constraints, creating a foreign key constraint does not automatically create a corresponding index. ただし、外部キーに手動でインデックスを作成することには、通常、次のような利点があります。However, manually creating an index on a foreign key is often useful for the following reasons:

  • クエリ内で、一方のテーブルの外部キー制約が定義された列を、他方のテーブルの主キー列または一意なキー列と照合することによって関連テーブルのデータが結合されるとき、多くの場合、外部キー列が結合基準に使用されます。Foreign key columns are frequently used in join criteria when the data from related tables is combined in queries by matching the column or columns in the foreign key constraint of one table with the primary or unique key column or columns in the other table. インデックスを使用すると、 データベース エンジンDatabase Engine により、外部キー テーブルの関連データがすばやく検索されます。An index enables the データベース エンジンDatabase Engine to quickly find related data in the foreign key table. ただし、必ずしもこのインデックスを作成する必要はありません。However, creating this index is not required. 2 つのテーブル間に主キー制約または外部キー制約が定義されていなくても、関連する 2 つのテーブルのデータを結合できます。ただし、2 つのテーブル間に外部キー リレーションシップが存在するということは、それら 2 つのテーブルが、結合基準としてキーを使用するクエリ内で結合されるように最適化されていることを示します。Data from two related tables can be combined even if no primary key or foreign key constraints are defined between the tables, but a foreign key relationship between two tables indicates that the two tables have been optimized to be combined in a query that uses the keys as its criteria.

  • 主キー制約に加えた変更が、関連テーブルの外部キー制約によってチェックされます。Changes to primary key constraints are checked with foreign key constraints in related tables.

参照整合性Referential Integrity

外部キー制約の主な目的は、外部キー テーブルに格納できるデータを制御することですが、主キー テーブルのデータに対する変更も制御されます。Although the main purpose of a foreign key constraint is to control the data that can be stored in the foreign key table, it also controls changes to data in the primary key table. たとえば、ある販売員の行が Sales.SalesPerson テーブルから削除され、その販売員の ID が Sales.SalesOrderHeader テーブルの販売注文に使用された場合、2 つのテーブル間の参照整合性は破棄されます。削除された販売員の販売注文は、 SalesPerson テーブルのデータへのリンクを持たない状態となり、 SalesOrderHeader テーブル内で孤立します。For example, if the row for a salesperson is deleted from the Sales.SalesPerson table, and the salesperson's ID is used for sales orders in the Sales.SalesOrderHeader table, the relational integrity between the two tables is broken; the deleted salesperson's sales orders are orphaned in the SalesOrderHeader table without a link to the data in the SalesPerson table.

外部キー制約を定義すると、このような状況が発生するのを防ぐことができます。A foreign key constraint prevents this situation. この制約により、外部キー テーブルのデータへのリンクが無効になるような変更を主キー テーブルのデータに加えることができなくなるため、参照整合性が保証されます。The constraint enforces referential integrity by guaranteeing that changes cannot be made to data in the primary key table if those changes invalidate the link to data in the foreign key table. 主キー テーブルの行を削除しようとするか、または主キー値を変更しようとした場合、削除または変更する主キー値が別のテーブルの外部キー制約の値と一致していると、その操作は失敗します。If an attempt is made to delete the row in a primary key table or to change a primary key value, the action will fail when the deleted or changed primary key value corresponds to a value in the foreign key constraint of another table. 外部キー制約が定義された行を正常に変更または削除するには、まず、外部キー テーブルの外部キー データを削除または変更し、外部キーから他の主キー データへのリンクを設定する必要があります。To successfully change or delete a row in a foreign key constraint, you must first either delete the foreign key data in the foreign key table or change the foreign key data in the foreign key table, which links the foreign key to different primary key data.

連鎖参照整合性Cascading Referential Integrity

連鎖参照整合性制約を使用することで、既存の外部キーが参照しているキーをユーザーが削除または更新するときの データベース エンジンDatabase Engine の動作を定義できます。By using cascading referential integrity constraints, you can define the actions that the データベース エンジンDatabase Engine takes when a user tries to delete or update a key to which existing foreign keys point. 以下の連鎖動作を定義できます。The following cascading actions can be defined.

NO ACTIONNO ACTION
NO ACTION を指定すると、 データベース エンジンDatabase Engine ではエラーが発生し、親テーブルでの行の削除操作または更新操作がロールバックされます。The データベース エンジンDatabase Engine raises an error and the delete or update action on the row in the parent table is rolled back.

CASCADECASCADE
親テーブルで行が更新または削除された場合に、参照元のテーブルでも対応する行が更新または削除されます。Corresponding rows are updated or deleted in the referencing table when that row is updated or deleted in the parent table. CASCADE は、 timestamp 型の列が外部キーまたは参照先キーの一部である場合は指定できません。CASCADE cannot be specified if a timestamp column is part of either the foreign key or the referenced key. INSTEAD OF DELETE トリガーが設定されているテーブルには、ON DELETE CASCADE を指定できません。ON DELETE CASCADE cannot be specified for a table that has an INSTEAD OF DELETE trigger. INSTEAD OF UPDATE トリガーが設定されているテーブルには、ON UPDATE CASCADE を指定できません。ON UPDATE CASCADE cannot be specified for tables that have INSTEAD OF UPDATE triggers.

SET NULLSET NULL
親テーブルの対応する行が更新または削除された場合、外部キーを形成するすべての値が NULL に設定されます。All the values that make up the foreign key are set to NULL when the corresponding row in the parent table is updated or deleted. この制約を実行するには、外部キー列が NULL 値を使用できる必要があります。For this constraint to execute, the foreign key columns must be nullable. INSTEAD OF UPDATE トリガーが設定されているテーブルには指定できません。Cannot be specified for tables that have INSTEAD OF UPDATE triggers.

SET DEFAULTSET DEFAULT
親テーブル内の対応する行が更新または削除されると、外部キーを構成するすべての値に既定値が設定されます。All the values that make up the foreign key are set to their default values if the corresponding row in the parent table is updated or deleted. この制約を実行するには、すべての外部キー列に既定値が定義されている必要があります。For this constraint to execute, all foreign key columns must have default definitions. 列が NULL 値を許容し、明示的な既定値が設定されていない場合は、列の既定値として NULL が暗黙的に使用されます。If a column is nullable, and there is no explicit default value set, NULL becomes the implicit default value of the column. INSTEAD OF UPDATE トリガーが設定されているテーブルには指定できません。Cannot be specified for tables that have INSTEAD OF UPDATE triggers.

CASCADE、SET NULL、SET DEFAULT および NO ACTION は、互いに参照関係にあるテーブルに対して組み合わせて使用することができます。CASCADE, SET NULL, SET DEFAULT and NO ACTION can be combined on tables that have referential relationships with each other. データベース エンジンDatabase Engine が NO ACTION を検出すると、関連する CASCADE、SET NULL および SET DEFAULT 操作が停止されロールバックされます。If the データベース エンジンDatabase Engine encounters NO ACTION, it stops and rolls back related CASCADE, SET NULL and SET DEFAULT actions. DELETE ステートメントの実行によって、CASCADE、SET NULL、SET DEFAULT および NO ACTION 操作の組み合わせが適用される場合、 データベース エンジンDatabase Engine が NO ACTION があるかどうかを調べる前にすべての CASCADE、SET NULL および SET DEFAULT 操作が適用されます。When a DELETE statement causes a combination of CASCADE, SET NULL, SET DEFAULT and NO ACTION actions, all the CASCADE, SET NULL and SET DEFAULT actions are applied before the データベース エンジンDatabase Engine checks for any NO ACTION.

トリガーと連鎖参照動作Triggers and Cascading Referential Actions

連鎖参照動作によって、AFTER UPDATE トリガーまたは AFTER DELETE トリガーは次のように起動します。Cascading referential actions fire the AFTER UPDATE or AFTER DELETE triggers in the following manner:

  • 元の DELETE または UPDATE によって直接発生するすべての連鎖参照動作が、まず実行されます。All the cascading referential actions directly caused by the original DELETE or UPDATE are performed first.

  • 連鎖動作を受けたテーブルに AFTER トリガーが定義されている場合、すべての連鎖動作が実行された後でトリガーが起動します。If there are any AFTER triggers defined on the affected tables, these triggers fire after all cascading actions are performed. AFTER トリガーの起動順序は連鎖動作の逆です。These triggers fire in opposite order of the cascading action. 1 つのテーブル内のトリガーの起動順序は、最初または最後に起動することが決まっているトリガーがある場合を除きランダムです。If there are multiple triggers on a single table, they fire in random order, unless there is a dedicated first or last trigger for the table. その起動順序は sp_settriggerorderでの指定に従います。This order is as specified by using sp_settriggerorder.

  • UPDATE 操作または DELETE 操作を直接受けたテーブルから複数の連鎖チェーンが始まる場合、それぞれのチェーンでトリガーが起動する順序は特定できません。If multiple cascading chains originate from the table that was the direct target of an UPDATE or DELETE action, the order in which these chains fire their respective triggers is unspecified. ただし、必ず 1 本のチェーンのトリガーがすべて起動した後で別のチェーンのトリガーが起動を開始します。However, one chain always fires all its triggers before another chain starts firing.

  • UPDATE 操作または DELETE 操作を直接受けるテーブルの AFTER トリガーは、どの行も影響を受けないとしても起動します。An AFTER trigger on the table that is the direct target of an UPDATE or DELETE action fires regardless of whether any rows are affected. その際、他のテーブルには連鎖が波及しません。There are no other tables affected by cascading in this case.

  • あるトリガーで他のテーブルに対し UPDATE 操作または DELETE 操作が行われた場合、操作の後に 2 次的な連鎖チェーンが開始される場合があります。If any one of the previous triggers perform UPDATE or DELETE operations on other tables, these actions can start secondary cascading chains. この 2 次的なチェーンは、最初に発生したチェーンのすべてのトリガーが起動した後でそれぞれの UPDATE 操作または DELETE 操作ごとに処理されます。These secondary chains are processed for each UPDATE or DELETE operation at a time after all triggers on all primary chains fire. その後の UPDATE 操作または DELETE 操作についても、この処理が再帰的に繰り返されます。This process may be recursively repeated for subsequent UPDATE or DELETE operations.

  • CREATE、ALTER、DELETE、またはその他の DDL (データ定義言語) 操作をトリガー内で実行すると、DDL トリガーが起動する場合があります。Performing CREATE, ALTER, DELETE, or other data definition language (DDL) operations inside the triggers may cause DDL triggers to fire. その結果、新たな連鎖チェーンを開始したりトリガーを起動したりする DELETE 操作または UPDATE 操作が実行されることもあります。This may subsequently perform DELETE or UPDATE operations that start additional cascading chains and triggers.

  • 特定の連鎖参照動作のチェーン内でエラーが発生した場合、エラーが表示され、そのチェーンの AFTER トリガーは起動されずに、チェーンを開始した DELETE 操作または UPDATE 操作がロールバックされます。If an error is generated inside any particular cascading referential action chain, an error is raised, no AFTER triggers are fired in that chain, and the DELETE or UPDATE operation that created the chain is rolled back.

  • INSTEAD OF トリガーを含んだテーブルに、連鎖動作を指定する REFERENCES 句を同時に指定することはできません。A table that has an INSTEAD OF trigger cannot also have a REFERENCES clause that specifies a cascading action. ただし、連鎖動作の対象になるテーブルの AFTER トリガーは、別のテーブルやビューに対して INSERT、UPDATE、または DELETE ステートメントを実行し、そのオブジェクトに定義されている INSTEAD OF トリガーを起動できます。However, an AFTER trigger on a table targeted by a cascading action can execute an INSERT, UPDATE, or DELETE statement on another table or view that fires an INSTEAD OF trigger defined on that object.

関連タスクRelated Tasks

次の表は、主キー制約および外部キー制約に関連した一般的なタスクの一覧です。The following table lists the common tasks associated with primary key and foreign key constraints.

タスクTask トピックTopic
主キーを作成する方法について説明します。Describes how to create a primary key. 主キーの作成Create Primary Keys
主キーを削除する方法について説明します。Describes how to delete a primary key. 主キーの削除Delete Primary Keys
主キーを変更する方法について説明します。Describes how to modify a primary key. 主キーの変更Modify Primary Keys
外部キー リレーションシップを作成する方法について説明します。Describes how to create foreign key relationships 外部キーのリレーションシップの作成Create Foreign Key Relationships
外部キー リレーションシップを変更する方法について説明します。Describes how to modify foreign key relationships. 外部キー リレーションシップの変更Modify Foreign Key Relationships
外部キー リレーションシップを削除する方法について説明します。Describes how to delete foreign key relationships. 外部キーのリレーションシップの削除Delete Foreign Key Relationships
外部キーのプロパティを表示する方法について説明します。Describes how to view foreign key properties. 外部キーのプロパティの表示View Foreign Key Properties
レプリケーションに対して外部キー制約を無効にする方法を説明します。Describes how to disable foreign key constraints for replication. レプリケーションに対して外部キー制約を無効にする方法Disable Foreign Key Constraints for Replication
INSERT または UPDATE ステートメント時に外部キー制約を無効にする方法について説明します。Describes how to disable foreign key constraints during an INSERT or UPDATE statement. INSERT ステートメントまたは UPDATE ステートメントに対して外部キー制約を無効にする方法Disable Foreign Key Constraints with INSERT and UPDATE Statements