通常、制約はINSERT、UPDATE、DELETE文など実行されたタイミングでチェックが行なわれますが、遅延制約を設定することで、このチェックのタイミングをCOMMIT時に遅らせることが出来ます。
表作成時にDEFERRABLE を設定することで、後続のトランザクションで遅延可能な設定が行なえます。
また、INITIALLY~ 以降の文で初期値を設定できます。
IMMEDIATEの場合、SQL文の実行後、すぐにチェックを行ないます。
DEFERREDの場合、COMMITの実行後にチェックを行ないます。
また、SET CONSTRAINT句を利用することで、トランザクションごとの設定を指定できます。
遅延制約の場合はDEFERREDを指定します。
SQL> CREATE TABLE TEST (COL1 NUMBER CONSTRAINT TEST_PK PRIMARY KEY DEFERRABLE INITIALLY IMMEDIATE);
表が作成されました。
表作成時にDEFERRABLE を設定することで、後続のトランザクションで遅延可能な設定が行なえます。
また、INITIALLY~ 以降の文で初期値を設定できます。
IMMEDIATEの場合、SQL文の実行後、すぐにチェックを行ないます。
DEFERREDの場合、COMMITの実行後にチェックを行ないます。
INSERT INTO TEST VALUES (1);
SQL> INSERT INTO TEST VALUES (1);
1行が作成されました。
SQL> INSERT INTO TEST VALUES ();
INSERT INTO TEST VALUES (1)
*
行1でエラーが発生しました。:
ORA-00001: 一意制約(SYS.TEST_PK)に反しています また、SET CONSTRAINT句を利用することで、トランザクションごとの設定を指定できます。
遅延制約の場合はDEFERREDを指定します。
SQL> SET CONSTRAINTS SYS.TEST_PK DEFERRED;
制約が設定されました。
SQL> INSERT INTO TEST VALUES (2);
1行が作成されました。
SQL> INSERT INTO TEST VALUES (2);
1行が作成されました。
SQL> COMMIT;
COMMIT
*
ORA-02091: トランザクションがロールバックされました。 ORA-00001:
一意制約(SYS.TEST_PK)に反しています:
COMMIT時のチェックにエラーがあった場合、トランザクションはロールバックされます。
続いて、遅延制約で表を作ってみます。
COMMIT時のチェックにエラーがあった場合、トランザクションはロールバックされます。
続いて、遅延制約で表を作ってみます。
SQL> CREATE TABLE TEST (COL1 NUMBER CONSTRAINT TEST_PK PRIMARY KEY DEFERRABLE INITIALLY DEFERRED);
表が作成されました。
遅延制約の場合、表作成時にDEFERRABLE INITIALLY DEFERREDを指定します。
遅延制約の場合、表作成時にDEFERRABLE INITIALLY DEFERREDを指定します。
SQL> INSERT INTO TEST VALUES (2);
1行が作成されました。
SQL> INSERT INTO TEST VALUES (2);
1行が作成されました。
SQL> COMMIT;
COMMIT
*
行1でエラーが発生しました。:
ORA-02091: トランザクションがロールバックされました。 ORA-00001:
一意制約(SYS.TEST_PK)に反しています
COMMIT時に制約のチェックを行なわれました。
チェックをSQL文の実行後に行わせるように変更する場合はSET CONSTRAINT句でIMMEDIATEを指定します。
制約のチェックがSQL文の実行後に行なわれました。
COMMIT時に制約のチェックを行なわれました。
チェックをSQL文の実行後に行わせるように変更する場合はSET CONSTRAINT句でIMMEDIATEを指定します。
SQL> SET CONSTRAINTS SYS.TEST_PK IMMEDIATE;
制約が設定されました。
SQL> INSERT INTO TEST VALUES (2);
1行が作成されました。
SQL> INSERT INTO TEST VALUES (2);
INSERT INTO TEST VALUES (2)
*
行1でエラーが発生しました。:
ORA-00001: 一意制約(SYS.TEST_PK)に反しています 制約のチェックがSQL文の実行後に行なわれました。

コメント