保全制約は、列の属性またはテーブルの属性のいずれかとして指定できます。
実テーブルの1つの列の要素にのみ適用される制約は、列属性制約と呼ばれます。
次のテーブル定義を考えてみましょう。
CREATE TABLE good_1 ( column_1 INTEGER NOT NULL CONSTRAINT primary_1 PRIMARY KEY, column_2 INTEGER NOT NULL CONSTRAINT unique_1 UNIQUE, column_3 INTEGER CONSTRAINT check_1 CHECK (column_3 > 0));
テーブルgood_1は、次の3つの列属性制約を定義します。
- good_1.column_1上のprimary_1という名前の単一PRIMARY KEY制約。
この制約では、good_1.column_1に挿入される値は、行を固有に識別するものでなければなりません。制約に違反すると、データベースは行の挿入を拒否します。
PRIMARY KEY値は更新されないため、通常、更新でこの制約に違反することはありませんが、違反した場合、データベースは更新を拒否します。
- good_1.column_2上のunique_1という名前の単一UNIQUE制約。
この制約では、good_1.column_2に挿入される値は、常に固有でなければなりません。制約に違反すると、データベースは行の挿入、または既存の行のgood_1.column_2の更新を拒否します。
- good_1.column_3上のcheck_1という名前の単一CHECK制約。
この制約では、good_1.column_3に挿入される値は、常にゼロより大きいかnullである必要があります。制約に違反すると、データベースは行の挿入、または既存の行のgood_1.column_3の更新を拒否します。
実テーブル内の複数の列、または別の実テーブルの1つ以上の列のいずれかに適用される制約は、テーブル属性制約と呼ばれます。
次に、以下のテーブル定義を考えてみましょう。
CREATE TABLE good_2 ( column_1 INTEGER NOT NULL column_2 INTEGER NOT NULL, column_3 INTEGER NOT NULL, column_4 INTEGER NOT NULL, column_5 INTEGER, column_6 INTEGER, CONSTRAINT primary_1 PRIMARY KEY (column_1, column_2), CONSTRAINT unique_1 UNIQUE (column_3, column_4), CONSTRAINT check_1 CHECK (column_3 > 0 OR column_4 IS NOT NULL), CONSTRAINT ref_1 FOREIGN KEY (column_5, column_6) REFERENCES parent_1 (column_2, column_3));
テーブルgood_2は、次の4つのテーブル レベルの制約を定義します。
- column_1およびcolumn_2上のprimary_1という名前の複合PRIMARY KEY制約。
この制約の場合、good_2.column_1およびgood_2.column_2に挿入される値は、行を固有に識別するものでなければなりません。制約に違反すると、データベースは行の挿入を拒否します。
PRIMARY KEY値は更新されないため、通常、この制約に違反することはありませんが、違反した場合、データベースは更新を拒否します。
- column_3およびcolumn_4上のunique_1という名前の複合UNIQUE制約。
この制約の場合、good_2.column_3およびgood_2.column_4に挿入される値は、これらの列の両方で常に固有でなければなりません。制約に違反すると、データベースは行の挿入、または既存の行の列good_2.column_3またはgood_2.column_4の更新を拒否します。
- column_3およびcolumn_4上の複数列CHECK制約。
この制約の場合、good_2.column_3に挿入される値がゼロより大きいか、またはgood_2.column_4に挿入される値がnull以外でなければなりません。これらの両方の制約に違反すると、データベースは行の挿入、またはgood_2の既存の行のこれらの列の更新を拒否します。
この制約はOR条件を使用して定義されるため、good_2.column_3がゼロより大きい場合、またはgood_2.column_4がnullでない場合のいずれかのとき制約が満たされます。
- good_2.column_5およびgood_2.column_6上の複合FOREIGN KEY制約。parent_1.column_2およびparent_1.column_3を参照し、good_2.column_5がparent_1.column_2にマッピングされ、good_2.column_6がparent_1.column3にマッピングされます。
この制約では、good_2.column_5およびgood_2.column_6のそれぞれの値が、parent_1.column_2およびparent_1.column_3の値のどのペアとも一致しない場合に、データベースは、good_2への行の挿入、またはgood_2の既存の行のこれらの列に対する更新を拒否します。
この制約は、good_2.column_5、good_2.column_6、parent_1.column_2、およびparent_1.column_3の列のすべてがnullである場合にも有効ですが、参照整合性制約の列にnullを許可することは設計の良い例とは言えません。