規則は、原因とその効果の単純なステートメントで、データベースに定義された RI システムによって実行されます。
たとえば、削除規則によって、主キーを持つレコードが削除されたときに、外部キーを持つレコードに何が起きるかが次のように定義されているとします。「'Bhargava Building' を含むレコードが削除されたとき、そのレコードを参照するテーブル A のすべての行は削除される。」
更新規則は、ユーザーがレコードを更新またはレコードを追加しようとしたときに、外部キーを含むレコードに何が起こるかを定義したもので、次のようなものです。「ユーザーがテーブル B に新しいレコードを追加しようとしたとき、ビル名がテーブル C に存在しなければ、追加することを拒否する。」
主キーは規則が従属する 1 つまたは複数の列です。どのテーブルでも主キーは 1 つだけ許可されており、重複値は許可されていません。更新規則では、主キーというのは、レコードの更新または追加が許可されるかどうかを判断するために、更新または追加した列と比較される列のことです。
例 A では、"Bhargava Building" を含む列が主キーです。
例 B では、テーブル C のビル名を含む列が主キーです。
外部キーは、処理方法を決定するために主キーと比較される 1 つまたは複数の列です。
前述の例 A では、テーブル A の "Bhargava Building" を含む列が外部キーです。
前述の例 B では、テーブル B のビル名を含む列が外部キーです。
カスケード規則は、データベースがある操作が起こることを許可し、ほかのテーブルまたは行を最初の操作と同期をとるように変更することによって RI を確実にする規則です。たとえば、
カスケード削除規則が定義されていると、主キー テーブルでのレコードの削除により、データベースは削除された行の主キーと同じ値の外部キーを持つデータベース中のすべての行を検索して削除します。
制限規則は、データベースに既に存在する値に基づく操作を許可するかどうかをデータベースが決定するのに使用する規則です。たとえば、更新制限規則が定義されている場合、外部キーを含む行をテーブルに追加しようとすると、データベース エンジンは外部キー フィールドの値を主キーの値と比較します。同じ値の主キーを持つ行が存在しない場合、その行を外部キー テーブルに追加することは許可されません。
上記の例では、テーブル A の student_ID(
A.student_ID)は IDENTITY データ型で、2 つの行が同じ値を持つことを許可していません。学生はそれぞれユニークな ID 番号を持ちます。
student_ID をテーブル A の主キーとして定義します。
それから、テーブル B の stud_ID(
B.stud_ID)を
A.student_ID を参照する外部キーとして定義します。
stud_ID のデータ型は、IDENTITY と比較できる INTEGER などのデータ型である必要があります。主キーと外部キーのデータ型には互換性が必要です。参照整合性を確実にするために、必要なだけの外部キーをいくつでも設定することができます。複数の外部キーは同一の主キーを参照することができます。
主キーを持つテーブルは親テーブルと呼ばれ、外部キーを持つテーブルは子テーブルと呼ばれます。いったんキーが定義されると、表 17 に示すように選択できる動作の範囲が限られます。必要なだけ規則を定義することができますが、タイプごとには 1 つしか定義できません。たとえば、削除制限規則を定義した場合、同じキーにカスケード削除規則を定義することはできません。これは、2 つの動作が相互に排他的であるためです。
前述の例で説明すると、更新制限規則を設定することにより、新規または更新された行の B.stud_ID の値は必ず
A.student_ID にも存在していることが保証されます。テーブル B に行を追加できるようにするには、その前に、テーブル A に行があることが必要です。言い方を変えると、子行を作成する前に少なくとも 1 つの親行を作成する必要があります。
PSQL は、相互に参照するテーブルでの循環削除カスケードを許可していません。たとえば、テーブル d1 と d2 があるとして、次のようなシナリオを考えます。
次の変更ステートメントは許可されません。テーブル d1 と d2 には既に削除カスケードの関係があるからです。
ほかの例については、『SQL Engine Reference』で CREATE TABLE を参照してください。