OceanBaseデータベースがいつ制約チェック(Checking of Constraint)を実行するかを明確にすることで、さまざまな制約が存在する場合に許可される操作タイプを明確にすることができます。
以下の図のように、emp テーブルを定義します。emp テーブルに自己参照制約(Self-Referential Constraint)を定義し、mgr 列の値は empno 列の値に依存します。例を簡略化するため、以下の内容は emp テーブルの empno (employee_id) および mgr (manager_id) 列のみを対象としています。

次に、emp テーブルに最初のデータを挿入します。この時点でテーブル内にデータがないため、mgr 列は empno 列の既存の値を参照できません。そのため、以下のシナリオに基づいてデータ挿入を実行できます:
mgr列にNOT NULL制約が定義されていない場合、1行目のmgr列にNULL値を入力できます。外部キー制約はNULL値を許容するため、この行は正常にテーブルに挿入できます。1行目の
empno列とmgr列に同じ値を入力できます。この場合、ステートメントの実行後に制約チェック(Constraint Checking)が実行されます。1行目の親キー(Parent Key)および外部キー(Foreign Key)に同じ値を挿入する場合、まずステートメント(つまりデータ行の挿入)を実行し、その後にこの行のデータのmgr列の値がこのテーブル内のどのempno列の値ともマッチするかどうかをチェックする必要があります。複数行の
INSERTステートメントを実行します。例えば、SELECTステートメントと組み合わせたINSERTステートメントは、相互に参照関係にある複数行のデータを挿入します。例えば、1行目のempno列の値は200、mgr列の値は300であり、2行目のempno列の値は300、mgr列の値は200です。
この場合も、データベースは制約チェックをステートメントの実行終了まで遅延させます。すべてのデータ行が最初に挿入された後、各行ごとに制約違反が存在するかどうかをチェックします。
上記の自己参照制約をもう一つ例を挙げて説明します。会社が買収され、新しい会社の従業員番号と一致させるために、すべての従業員番号を現在の値に5000を加えて更新する必要があるとします。マネージャー番号も従業員番号であるため、この値も5000加算する必要があります。次の図は、更新前の emp テーブルであり、empno と mgr の2つの列が含まれています。empno 列には3つの値:210、211、212があります。mgr 列には2つの値:210と211があります。

emp テーブルに以下のSQLを実行します:
UPDATE EMP
SET empno = empno + 5000,
mgr = mgr + 5000;
emp テーブルに定義された制約では、各 mgr 値が empno 値とマッチする必要がありますが、このステートメントは依然として実行可能です。これは、ステートメントの実行後に制約チェックが行われるためです。次の図は、SQLステートメントのすべての操作が完了した後に制約チェックが行われることを示しています。

まず各従業員番号に5000を加算し、次に各マネージャー番号に5000を加算します。最初のステップでは、empno 列の値210が5210に更新されます。2番目のステップでは、empno 列の値211が5211に更新され、mgr 列の値210が5210に更新されます。3番目のステップでは、empno 列の値212が5212に更新され、mgr 列の値211が5211に更新されます。最後に制約チェックが実行されます。
上記の例は、INSERT および UPDATE ステートメントの制約チェックメカニズムを示しています。実際には、UPDATE、INSERT、および DELETE などの各種DMLステートメントの制約チェックメカニズムはすべて同じです。