オラクる。

oracle専門ブログにしてみようかな~っと

2015年02月

300記事を記念して、久しぶりにグルメブログ
場所は大久保
大久保といえば韓国料理店が多いけれど、タイ料理屋さんも多い
ベトナム料理も美味しいお店があるし、インド料理もある
要は多国籍の町

20150201_043334765_iOS

こちらは新大久保駅そばの横道に入ったところにある「クンメー本店」のランチ
ランチメニューは全てにサラダ、デザート、スープ、ドリンクバーが着いて800円
メインの一品はかなりボリューム感があるので、お得感があり、かなりCPは高いです

しかし、味は本格的で辛いものはとっても辛くて、汗も大量にかいてしました
その辛さも苦にならないウマさで、大満足のランチでした

安くて美味しいタイ料理をたっぷりと、絶対にオススメできる大久保のお店です
ただ、近距離に「クンメー1」「クンメー2」というお店があるので、ちょっと紛らわしいです
「クンメー本店」を予約しながらも、まちがって「クンメー1」に行ってしまいました
要注意!

 

通常、制約はINSERT、UPDATE、DELETE文など実行されたタイミングでチェックが行なわれますが、遅延制約を設定することで、このチェックのタイミングをCOMMIT時に遅らせることが出来ます。

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時のチェックにエラーがあった場合、トランザクションはロールバックされます。

続いて、遅延制約で表を作ってみます。

SQL> CREATE TABLE TEST (COL1 NUMBER CONSTRAINT TEST_PK PRIMARY KEY 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> 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文の実行後に行なわれました。

表内の既存データや新規データに関して、制約チェックを行なうか行なわないかを選択することが出来ます。
検証のためサンプル表を作成してみます。

SQL> CREATE TABLE TEST (COL1 NUMBER CONSTRAINT TEST_PK PRIMARY KEY);

表が作成されました。 

PrimaryKeyの列が1つだけある表です。

SQL> INSERT INTO TEST VALUES (1);

1行が作成されました。

SQL> INSERT INTO TEST VALUES (1);
INSERT INTO TEST VALUES (1)
*
行1でエラーが発生しました。:
ORA-00001: 一意制約(SYS.TEST_PK)に反しています

制約性が有効であることを確認しています。

SQL> ALTER TABLE TEST DISABLE VALIDATE CONSTRAINT TEST_PK;

表が変更されました。 

DISABLE/ENABLEで新規データの制約チェックを行なうかを、VALIDATE/NOVALIDATEで既存データの制約チェックを行なうかを選択します。
DISABLE VALIDATEで既存データのみ制約チェックを行なうように指定しています。

SQL> INSERT INTO TEST VALUES (2);
INSERT INTO TEST VALUES (2)
*
行1でエラーが発生しました。:
ORA-25128:
制約(SYS.TEST_PK)が使用禁止および検査対象の表で挿入/更新/削除はできません。 

DISABLE VALIDATEの場合、表への挿入/更新/削除は一切出来なくなるためです。
新規データは制約チェックを行なわないため、制約違反のデータが入ってくる可能性があるためです。

SQL> ALTER TABLE TEST DISABLE NOVALIDATE CONSTRAINT TEST_PK;

表が変更されました。

SQL> INSERT INTO TEST VALUES (2);

1行が作成されました。 

SQL> INSERT INTO TEST VALUES (1);

1行が作成されました。 

DISABLE NOVALIDATEで新規データ、既存データともに制約チェックを行ないません。
制約に違反するデータを挿入することが出来ます。

SQL> ALTER TABLE TEST DISABLE VALIDATE CONSTRAINT TEST_PK;
ALTER TABLE TEST DISABLE VALIDATE CONSTRAINT TEST_PK
*
行1でエラーが発生しました。:
ORA-02437: (SYS.TEST_PK)を検証できません - 主キー違反です。

DISABLE VALIDATEに変更してみました。
今度は既存データのチェックを行なうので、既存データに制約違反のデータが存在すると、変更することが出来ません。
制約違反のデータを削除してからDISABLE VALIDATEに変更します。

このページのトップヘ