ORA-00001 一意の制約に違反していることは、データの読み込み中によく表示されるメッセージの1つです。
このORA-00001の一意性制約違反エラーは、一意性インデックスによって制限されたフィールドに重複する値を作成したINSERTまたはUPDATEステートメントを実行しようとしたときに発生します。
ORA-00001を解決するために実行するチェックリスト
このORA-00001に対して次のアクションアイテムを実行できます
(1)以下のSQLでエラーを確認し、制約情報を見つけることができます
SELECT column_name, position FROM all_cons_columns WHERE constraint_name = '<name of the constraint in error>' AND owner = '<table owner>' AND table_name = '<table name>'
これで、挿入するデータを使用して既存のデータを確認し、それに応じてアクションを実行できます。キーを変更して挿入できるようにすることができます
CREATE TABLE EXAMPLE_UNIQ( EXAM_ID NUMBER NOT NULL ENABLE, EXAM_NAME VARCHAR2(250) NOT NULL ENABLE CONSTRAINT UK1_EXAMPLE UNIQUE (EXAM_ID, EXAM_NAME) ENABLE ); table created. INSERT INTO EXAMPLE_UNIQ (EXAM_ID, EXAM_NAME) VALUES (1000, 'XYZ'); 1 rows inserted. Commit; INSERT INTO EXAMPLE_UNIQ (EXAM_ID, EXAM_NAME) VALUES (1000, 'XYZ'); SQL Error: ORA-00001: unique constraint (UK1_EXAMPLE) violated Solution INSERT INTO EXAMPLE_UNIQ (EXAM_ID, EXAM_NAME) VALUES (1001, 'XYZ'); 1 rows inserted.
(2)テーブルでの重複が許可されている場合は、制約を削除できます
例
alter table <table name> drop constraint <constraint name>;
(3)11gr2ヒントignore_row_on_dupkey_indexを使用すると、ステートメントでORA-00001エラーをサイレントに無視できます。
- IGNORE_ROW_ON_DUPKEY_INDEXヒントは、セマンティック効果があるという点で他のヒントとは異なります。 「ヒント」で説明されている一般的な哲学は、これら3つのヒントには適用されません。
- IGNORE_ROW_ON_DUPKEY_INDEXヒントは、単一テーブルのINSERT操作にのみ適用されます。 UPDATE、DELETE、MERGE、またはマルチテーブル挿入操作ではサポートされていません。 IGNORE_ROW_ON_DUPKEY_INDEXにより、ステートメントは、指定された列のセットまたは指定されたインデックスの一意キー違反を無視します。一意キー違反が発生すると、行レベルのロールバックが発生し、次の入力行から実行が再開されます。 DMLエラーロギングを有効にしてデータを挿入するときにこのヒントを指定すると、一意キー違反はログに記録されず、ステートメントが終了しません。
このヒントのセマンティック効果により、特定のルールに違反した場合にエラーメッセージが表示されます。
- インデックスを指定する場合、インデックスは存在し、一意である必要があります。それ以外の場合、ステートメントはORA-38913を引き起こします。
- インデックスを1つだけ指定する必要があります。インデックスを指定しない場合、ステートメントはORA-38912を引き起こします。複数のインデックスを指定すると、ステートメントによってORA-38915が発生します。
- INSERTステートメントでCHANGE_DUPKEY_ERROR_INDEXまたはIGNORE_ROW_ON_DUPKEY_INDEXヒントのいずれかを指定できますが、両方を指定することはできません。両方を指定すると、ステートメントによってORA-38915が発生します。
- すべてのヒントと同様に、ヒントの構文エラーにより、ヒントは黙って無視されます。その結果、ヒントが使用されなかったかのように、ORA-00001が発生します。
insert /*+ ignore_row_on_dupkey_index(unique_table, unique_table_idx) */ into unique_table (select * from non_unique_table);
関連記事
ORA-00911:無効な文字
ORA-03113:通信チャネルのファイルの終わり
ORA-00257
ORA-29285:ファイル書き込みエラー
外部テーブルのORA-29913
oracleでクエリを削除します
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e0.htm