- TOP
- 技術情報
- Oracle DB Tips
- ORA-00001: 一意制約(??.??)に反しています
KNOWLEDGE
コーソルの技術情報
KNOWLEDGE検索
コーソルでは経験豊かなエンジニアが、Oracle Databaseに関するお役立ち情報を発信しています。
データベースのチューニングや設定にお役立ていただけます。
コーソルの技術情報
KNOWLEDGE検索
コーソルでは経験豊かなエンジニアが、Oracle Databaseに関するお役立ち情報を発信しています。
データベースのチューニングや設定にお役立ていただけます。
Oracle DB Tips
表の列(または複数の列)に対して、一意制約(ユニークキー制約)と呼ばれる、データの一意性を保証する制約を設定することができます。一意制約(ユニークキー制約)が設定された場合、表の列(または複数の列)に重複したデータを格納することができません。
一意制約が設定されている列(または複数の列)に対して、重複したデータをINSERTしようとしたとき、または重複したデータにUPDATEしようとしたときに、ORA-00001エラーが発生します。
また、主キー制約(プライマリキー制約)には、一意制約(ユニークキー制約)と同じくデータの一意性を保証する機能があり、同様な状況でORA-00001エラーが発生します。
ORA-00001: 一意制約(XXXXX.SYS_CXXXXX)に反しています
ORA-00001は一般に以下の要因で発生します。
一意制約が付与された列(また複数の列)について重複しないように格納する値を変更してください。
そもそも列に対して一意性が不要な場合は、索引の一意制約を削除してください。
INSERT INTO A SELECT * FROM B; などの大量データを一度に処理する場合にORA-00001エラーが発生したとき、原因となるデータの特定が困難な場合があります。
このような場合、DBMS_ERRLOG(*1) パッケージ(Oracle 10g Release2より) と LOG ERRORS 句を使用することでエラーの発生する原因レコードデータをロギングすることができます。ロギングにはDBMS_ERRLOG を使い、テーブル単位に手動でログ用テーブルを作成する必要があります。
(*1) DBMS_ERRLOGパッケージの詳細はマニュアルをご確認ください。
SQL> CREATE TABLE TRANS ( 2 ITEM VARCHAR(10), 3 NUM NUMBER 4 ); 表が作成されました。 SQL> CREATE TABLE MASTER ( 2 ITEM VARCHAR(10) PRIMARY KEY, /* プライマリキー */ 3 NUM NUMBER 4 ); 表が作成されました。 SQL> INSERT INTO TRANS VALUES ('A', 10); 1行が作成されました。 SQL> INSERT INTO TRANS VALUES ('A', 20); 1行が作成されました。 SQL> INSERT INTO TRANS VALUES ('B', 30); 1行が作成されました。 SQL> INSERT INTO TRANS VALUES ('B', 40); 1行が作成されました。 SQL> INSERT INTO MASTER SELECT * FROM TRANS; INSERT INTO MASTER SELECT * FROM TRANS * 行1でエラーが発生しました。: ORA-00001: 一意制約(XXXXX.SYS_CXXXXX)に反しています
以下にDBMS_ERRLOG を使用して問題のデータを特定した例を示します。
SQL> exec dbms_errlog.create_error_log('master'); PL/SQLプロシージャが正常に完了しました。 SQL> desc err$_master 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- ORA_ERR_NUMBER$ NUMBER ORA_ERR_MESG$ VARCHAR2(2000) ORA_ERR_ROWID$ ROWID ORA_ERR_OPTYP$ VARCHAR2(2) ORA_ERR_TAG$ VARCHAR2(2000) ITEM VARCHAR2(4000) NUM VARCHAR2(4000) -- LOG ERRORS REJECT LIMIT UNLIMITED エラー発生箇所をすべてロギングします。 SQL> insert into master select * from trans LOG ERRORS REJECT LIMIT UNLIMITED; 2行が作成されました。 SQL> select * from master; ITEM NUM ---------- ---------- A 10 B 30 SQL> select item, num, ora_err_mesg$ from err$_master; ITEM NUM ORA_ERR_MESG$ -------- -------- ------------------------------------------------------------ A 20 ORA-00001: 一意制約(XXXXX.SYS_CXXXXX)に反しています B 40 ORA-00001: 一意制約(XXXXX.SYS_CXXXXX)に反しています -- ORA-00001エラーとなる2レコードがロギングされています。
* 調査終了後、DROP TABLE err$_master; を実行してロギング用テーブルを削除して下さい。
ORA-1 ORA-00001 キー重複 重複 一意制約違反 重複データ特定