CHECK完全性制約(Integrity Constraint)は、列または列の集合に定義されます。この制約では、データ行がユーザー定義のチェック条件を満たすか、条件判定結果が不明(Unknown)であることが求められます。DMLステートメントがCHECK完全性制約のチェック結果を偽(False)とする場合、そのステートメントはロールバック(Rolled Back)され、エラーが報告されます。
以下の例は、CHECK制約構文の主な特徴を示しています。
obclient> CREATE TABLE t1(c1 INT, c2 INT, CONSTRAINT t1_cst_c1_equals_c2 CHECK(c1 = c2));
Query OK, 0 rows affected
obclient> INSERT INTO t1 VALUES(1, 1);
Query OK, 1 row affected
obclient> INSERT INTO t1 VALUES(2, 3);
OBE-02290: check constraint violated
ユーザーはCHECK制約を使用してチェック条件(Check Condition)を定義し、特殊な整合性ルール(Integrity Rule)を実現できます。CHECK制約のチェック条件を定義する際には、以下の制限があります:
チェック条件は、挿入または更新されるデータ行内の値を評価するためのブール式(Boolean Expression)でなければなりません。
チェック条件には、サブクエリ(Subquery)、シーケンス(Sequence)、ROWNUMなどの疑似列(Pseudo column)、およびSYSDATE()、UID()、USER()、USERENV()など、異なる環境やシナリオで実行すると計算結果が異なる可能性のあるシステム関数を含めることはできません。
同一の列は複数のCHECK制約の条件定義によって参照されることができます。つまり、ユーザーが特定の列に定義できるCHECK制約の数に制限はありません。ユーザーが一つの列に複数のCHECK制約を作成する場合、各制約のチェック条件が互いに矛盾しないようにする必要があります。CHECK制約のチェック順序は不確定であり、各CHECK制約が互いに排他的(Mutually Exclusive)であるかどうかもチェックされません。