株式会社コーソル

KNOWLEDGE

コーソルの技術情報

コーソルでは経験豊かなエンジニアが、Oracle Databaseに関するお役立ち情報を発信しています。
データベースのチューニングや設定にお役立ていただけます。

KNOWLEDGE検索人気のキーワード

Oracle DB Tips

ORA-02290:チェック制約(???.???)に違反しました

01.ORA-02290はどのようなエラーか?

挿入しようとしている値が、指定されたチェック制約を満たしていない場合に発生するエラーです。

02.ORA-02290エラーの出力例

以下にORA-02290エラーの発生例を示します。

SQL> create table tab1 (col1 varchar2(10));
表が作成されました。
SQL> alter table tab1 add constraint tab1_ck
2 check( not REGEXP_LIKE(col1,'[^(A-z)(0-9)]'));
表が変更されました。
SQL>  insert into tab1 values('1');
1行が作成されました。
SQL> insert into tab1 values('10');
1行が作成されました。
SQL> insert into tab1 values('a');
1行が作成されました。
SQL> insert into tab1 values('A');
1行が作成されました。
SQL> insert into tab1 values('"');
insert into tab1 values('"')
*
行1でエラーが発生しました。:
ORA-02290: チェック制約(SCOTT.TAB1_CK)に違反しました

上記のケースでは、col1列にはアルファベットか数字のみが指定できるようチェック制約が作成されています。そのため、記号を挿入しようとした際にはチェック制約に違反するといったエラーが発生します。

03.ORA-02290の一般的な発生要因と対処

挿入しようとしている値が、指定されたチェック制約を満たしていない場合に発生します。制約に違反する値を挿入しないことが、対処方法となります。

04.チェック制約とは

チェック 制約によって、表の各行に必要な条件を指定できます。
制約を満たすためには、表のそれぞれの行が、その条件に対してTRUE または不明(NULL のため)のいずれかである必要があります。
特定の行に対するCHECK 制約条件が評価される場合、条件にある列名に、その行の列値が適用されます。

チェック制約の制限事項
  • ビューに対しては、CHECK 制約を指定できません。ただし、WITH CHECK OPTION 句を使用してビューを定義することは可能です。これは、ビューにCHECK 制約を指定することと同じです。
  • CHECK 制約の条件では、その表の中のすべての列を参照できますが、他の表の列は参照できません。
  • CHECK 制約の条件は、次の構造を持つことができません。
  • 副問合せおよびスカラー副問合せ式
  • 決定的でないファンクションへのコール(CURRENT_DATE、CURRENT_TIMESTAMP、DBTIMEZONE、LOCALTIMESTAMP、SESSIONTIMEZONE、SYSDATE、SYSTIMESTAMP、UID、USER およびUSERENV)
  • ユーザー定義ファンクションへのコール
  • REF 列の参照解除(DEREF ファンクションを使用する場合など)
  • ネストした表の列または属性
  • 疑似列CURRVAL、NEXTVAL、LEVEL またはROWNUM
  • 完全に指定されていない日付定数

05.キーワード

ORA-02290