表内の既存データや新規データに関して、制約チェックを行なうか行なわないかを選択することが出来ます。
検証のためサンプル表を作成してみます。
表が作成されました。
PrimaryKeyの列が1つだけある表です。
制約性が有効であることを確認しています。
表が変更されました。
DISABLE/ENABLEで新規データの制約チェックを行なうかを、VALIDATE/NOVALIDATEで既存データの制約チェックを行なうかを選択します。
DISABLE VALIDATEで既存データのみ制約チェックを行なうように指定しています。
DISABLE VALIDATEの場合、表への挿入/更新/削除は一切出来なくなるためです。
新規データは制約チェックを行なわないため、制約違反のデータが入ってくる可能性があるためです。
1行が作成されました。
1行が作成されました。
DISABLE NOVALIDATEで新規データ、既存データともに制約チェックを行ないません。
制約に違反するデータを挿入することが出来ます。
検証のためサンプル表を作成してみます。
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);
SQL> INSERT INTO TEST VALUES (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に変更します。
DISABLE VALIDATEに変更してみました。
今度は既存データのチェックを行なうので、既存データに制約違反のデータが存在すると、変更することが出来ません。
制約違反のデータを削除してからDISABLE VALIDATEに変更します。

コメント