参照制約
Db2 は、参照制約を定義するときに、表間の参照整合性を確保します。
参照整合性 とは、すべての外部キー の値がすべて有効である状態を意味します。 参照整合性は、エンティティー保全性 に基づきます。 エンティティー保全性では、各エンティティーにユニーク・キーがあることが必要です。 例えば、表の各行がユニーク・エンティティーに対する関係を表している場合、この表には 1 つの列または列セットが存在する必要があり、それによりその表の行に対してユニーク ID を提供します。 この列 (または列セット) はその表の親キーと呼ばれます。 親キーには重複した値が含まれていないことを保証するために、親キーを構成する列 (複数の場合あり) に対してユニーク索引を定義する必要があります。 親キーを定義することは、エンティティー保全性と呼ばれます。
参照制約 とは、外部キーの非 NULL 値が、親キーの値としても使用される 場合にのみ有効であるという規則です。 親キーを含む表を参照制約の親表、外部キーを 含む表をその表の従属表 と呼びます。
DEPT 表と EMP 表のいくつかの行の間の関係 (下図を参照) により、参照整合性の概念と用語が分かりやすく記述されています。 例えば、参照整合性が保証することは、EMP 表の DEPT 列にある各外部キー値が DEPT 表の DEPTNO 列にある主キーと同じであるということです。
親と従属の 2 つの関係が、DEPT 表と EMP 表の間に存在します。
- DEPT 列に対する外部キーは、親関係と従属関係を確立しています。 EMP 表の DEPT 列は、DEPT 表の DEPTNO に従属しています。 この外部キーの関係を通じて、DEPT 表は EMP 表の親です。 NULL 値を指定して社員を部門に割り当てることはできず、存在しない部門に社員を割り当てることはできません。
- また、MGRNO 列に対する外部キーは、親関係と従属関係を確立しています。 MGRNO は EMPNO に従属するため、EMP はこの関係の親表であり、DEPT は従属表です。
1 つ以上の列に対して主キーを定義できます。 複数の列を含む主キーは、複合キー と呼ばれます。 また、外部キーにも 1 つ以上の列を含むことができます。 外部キーに複数の列が含まれている場合、対応する主キーは複合キーである必要があります。 外部キー列の個数は、親キー列の個数と同じである必要があり、対応する列のデータ・タイプは互換性がある必要があります。 (サンプル プロジェクト アクティビティ テーブル DSN8C10. PROJACT は、複数の列 PROJNO、ACTNO、および ACSTDATE に主キーを持つテーブルの例です。)
表は、その表自身に従属しても構いません。これは 自己参照表 と呼ばれます。 例えば、DEPT 表は自己参照表です。その理由は、管理部門 (ADMRDEPT) の値は部門 ID (DEPTNO) である必要があるからです。 自己参照制約を強制するため、 Db2 では外部キーを定義する必要があります。
同様の用語が親子関係を持った行にも適用されます。 従属表の行 (従属行 と呼ばれる) は、親表の行 (親行 と呼ばれる) を参照します。 ただし、親表の行が常に親行であるとは限りません (親表の行が参照されないことがある)。 同様に、従属表の行が常に従属行であるとは限りません (外部キーにより NULL 値を指定できることがあり、NULL 値はその他の行を参照しない)。
参照制約はオプションです。 参照制約を定義するには、CREATE TABLE と ALTER TABLE ステートメントを使用します。
Db2 以下のアクションが発生した際に、参照制約を強制します
- 従属表に INSERT ステートメントが適用される。
- UPDATE ステートメントが従属表の外部キーまたは親表の親キーに適用される。
- 挿入操作を含む MERGE ステートメントが従属表に適用される。
- 更新操作を含む MERGE ステートメントが従属表の外部キーまたは親表の親キーに適用される。
- DELETE ステートメントが親表に適用される。 削除操作を正しく行うには、影響を受ける参照制約および 影響を受ける関係の削除規則のすべてが、満たされなければなりません。
- ENFORCE CONSTRAINTS オプション指定の LOAD ユーティリティーが、 従属表で実行される。
- CHECK DATA ユーティリティーが実行される。
別のタイプの参照制約として、通知参照制約 があります。 この種の制約は、通常運用時には Db2 によって強制されません。 アプリケーション処理で参照整合性関係にあるデータを検証する必要があります。 通知参照制約により、照会がマテリアライズ照会表を利用できるようになります。
参照制約に従った処理が実施される順序は定義されていません。 この順番によって操作結果に影響が出ることがないように、 削除規則の定義および一定のステートメントの使用法に制限があります。 この制限事項については、SQL ステートメントの CREATE TABLE、ALTER TABLE、INSERT、UPDATE、MERGE、および DELETE の説明のところで述べています。
- 親キー
- 親キーとは、参照制約の主キーまたはユニーク・キーのことです。
- 親表
- 少なくとも 1 つの参照制約で親である表。 表は、任意の数の参照制約の中で親表として定義することができます。
- 従属表 (dependent table)
- 少なくとも 1 つの参照制約において従属である表。 表は、任意の数の参照制約の中で従属表として定義することができます。 従属表を親表にすることもできます。
- 下層表
- 別の表の従属表である表、あるいは下層表の従属表である表。
- 参照サイクル
- 関連するそれぞれの表がその表自身の下層表となるような参照制約の集合。
- 親行
- 1 つ以上の従属行を持つ行。
- 従属行 (dependent row)
- 1 つ以上の親行を持つ行。
- 下層行
- 別の行の従属行である行、あるいは 下層行の従属行である行。
- 自己参照行 (self-referencing row)
- それ自身の親である行。
- 自己参照表
- 同一の参照制約の中で親表であると同時に従属表でもある表。 この制約を、自己参照制約 といいます。
BUSINESS_TIME 期間を含む表に対して、テンポラル参照制約を定義できます。 PERIOD BUSINESS_TIME 文節は、FOREIGN KEY 文節と REFERENCES 文節の両方で使用され、子表の行に対する BUSINESS_TIME 期間値によって表される期間が、親表にある 1 つ以上の対応する行の BUSINESS_TIME 期間に含まれないことは不許可であることを示します。 通常の参照制約とは異なり、子行の BUSINESS_TIME 期間を含んでいる BUSINESS_TIME 期間を持つ親表の対応する行は、ただ 1 つである必要はありません。 子表の行の BUSINESS_TIME 期間が、親表内で複数の連続するマッチング行の BUSINESS_TIME 期間の和集合に含まれている場合は、テンポラル参照制約が満たされます。
- BUSINESS_TIME WITHOUT OVERLAPS 文節を指定した親表のユニーク索引。
- BUSINESS_TIME WITH OVERLAPS 文節を指定した子表の非ユニーク索引。 また、索引キーの最後に含まれる終了列の次に BUSINESS_TIME 期間の開始列が続く場合 (両方とも昇順) は、BUSINESS_TIME WITH OVERLAPS 文節を指定せずに子表の索引を定義できます。
- 挿入規則
- 外部キーに非 NULL 値を挿入する場合は、その非 NULL 値が、 親表の親キーの特定の値に一致していなければなりません。 複合外部キーの値は、そのいずれかのコンポーネントが NULL の場合には NULL となります。
- 更新規則
- 外部キーの値を非 NULL 値に更新する場合は、その非 NULL 値が、 親表の親キーの特定の値に一致していなければなりません。 複合外部キーの値は、そのいずれかのコンポーネントが NULL の場合に NULL と見なされます。
- 削除規則
- 親表の行が削除されるときの処理を制御します。 参照制約を定義した場合に行うアクションは、RESTRICT、NO ACTION、CASCADE、または SET NULL から選択できます。 SET NULL を指定できるのは、外部キーのいずれかの列で NULL 値が可能な場合だけです。
さらに厳密に言えば、この削除規則は、親表の行が削除操作または 伝搬された削除操作のオブジェクトであり、その行が参照制約の従属表 の中に従属行を持っている場合に適用されます。 伝搬された削除 とは、親行が削除されると従属行が削除される状態を表します。 P が親表、D が従属表を示すものとします。また、p は削除操作 または伝搬された削除操作のオブジェクトである親行を示すものとします。 削除規則に応じて、次のようになります。
- RESTRICT または NO ACTION の場合は、エラーとなり、 行は削除されません。
- CASCADE の場合は、削除操作が D の中の p の従属行にまで伝搬されます。
- SET NULL の場合は、D の中の p の各従属行の外部キーの NULL 可能な列が、それぞれ NULL に設定されます。
ある表が親表になっている参照制約には、それぞれ独自の削除規則があるので、 適用可能なすべての削除規則を使用して削除操作の結果が判別されます。 したがって、行が、RESTRICT ま たは NO ACTION の削除規則、あるいは、RESTRICT または NO ACTION の削除規則をもつ参照制約内の従属表である下層表のいずれかへの削除カスケード をもつ参照制約内に従属表をもつ場合は、その行を削除することはできませ ん。
親表 P からの行の削除には、他の表も関係します。また、これらの表の行が 影響を受けることもあります。
- D が P の従属表で、削除規則が RESTRICT または NO ACTION の 場合、D は削除操作に関係しますが、削除操作の対象にはならず、 親表 P からの削除は行われません。
- D が P の従属表で削除規則が SET NULL の場合、D は削除操作 に関係し、また削除操作中に D の行が更新される可能性もあります。
- D が P の従属表で削除規則が CASCADE の場合、D は削除操作に関係し、また削除操作中に D の行が削除される可能性もあります。 D 日 の行が削除された場合、 P に対する削除操作は、 D 日に伝搬されたと見なされます。 D 日 が親表でもある場合、このリストで説明されているアクションは、 D 日の従属表に順番に適用されます。
P での削除操作に関与する可能性がある表は、 Pに対して 接続削除 であると言われます。 したがって、表が表 P に連結削除されるのは、その表が P の従属表である場合、または P からの削除操作がカスケードされる表の従属表である場合です。