sql >> データベース >  >> RDS >> Oracle

ORA-00001一意性制約に違反しました

    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


    1. SQLServerデータベース内のシステムテーブルの数をカウントする3つの方法

    2. SQL Serverのインラインテーブル値関数(ITVF)の概要

    3. エラー「ORA-01790:式は対応する式と同じデータ型である必要があります」を修正しました

    4. ユーザーのJavaJDBCアクセスが拒否されました