Oracle
 sql >> Database >  >> RDS >> Oracle

Vincolo univoco ORA-00001 violato

ORA-00001 il vincolo univoco violato è uno dei messaggi comuni che riceviamo spesso durante il caricamento dei dati.

Questo errore di violazione del vincolo univoco ORA-00001 si verifica quando hai tentato di eseguire un'istruzione INSERT o UPDATE che ha creato un valore duplicato in un campo limitato da un indice univoco.

Elenco di controllo da eseguire per risolvere ORA-00001

Possiamo eseguire le seguenti azioni per questo ORA-00001

(1) Puoi guardare l'errore e trovare le informazioni sul vincolo con il seguente 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>'

Ora possiamo controllare i dati esistenti con i dati che stiamo inserendo e quindi agire di conseguenza. Puoi modificare le chiavi in ​​modo che possano essere inserite

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)  Possiamo eliminare il vincolo se nella tabella sono consentiti duplicati

Esempio

alter table <table name> drop constraint <constraint name>;

(3) L'hint 11gr2 ignore_row_on_dupkey_index consente all'istruzione di ignorare silenziosamente gli errori ORA-00001.

  • Gli hint IGNORE_ROW_ON_DUPKEY_INDEX sono diversi dagli altri suggerimenti in quanto hanno un effetto semantico. La filosofia generale spiegata in "Suggerimenti" non si applica a questi tre suggerimenti.
  • L'hint IGNORE_ROW_ON_DUPKEY_INDEX si applica solo alle operazioni INSERT su una singola tabella. Non è supportato per UPDATE, DELETE, MERGE o operazioni di inserimento multitabella. IGNORE_ROW_ON_DUPKEY_INDEX fa sì che l'istruzione ignori una violazione di chiave univoca per un set di colonne specificato o per un indice specificato. Quando viene rilevata una violazione della chiave univoca, si verifica un rollback a livello di riga e l'esecuzione riprende con la riga di input successiva. Se specifichi questo suggerimento durante l'inserimento di dati con la registrazione degli errori DML abilitata, la violazione della chiave univoca non viene registrata e non causa la chiusura dell'istruzione.

L'effetto semantico di questo suggerimento si traduce in messaggi di errore se vengono violate regole specifiche:

  • Se specifichi index, l'indice deve esistere ed essere univoco. In caso contrario, l'istruzione causa ORA-38913.
  • Devi specificare esattamente un indice. Se non specifichi alcun indice, l'istruzione causa ORA-38912. Se specifichi più di un indice, l'istruzione genera ORA-38915.
  • Puoi specificare un suggerimento CHANGE_DUPKEY_ERROR_INDEX o IGNORE_ROW_ON_DUPKEY_INDEX in un'istruzione INSERT, ma non entrambi. Se specifichi entrambi, l'istruzione causa ORA-38915.
  • Come per tutti i suggerimenti, un errore di sintassi nel suggerimento fa sì che venga ignorato silenziosamente. Il risultato sarà che verrà causato ORA-00001, proprio come se non fosse stato utilizzato alcun suggerimento.
insert /*+ ignore_row_on_dupkey_index(unique_table, unique_table_idx) */
into
unique_table
(select * from non_unique_table);

Articoli correlati

ORA-00911:carattere non valido
ORA-03113:fine file sul canale di comunicazione
ORA-00257
ORA-29285:errore di scrittura file
ORA-29913 con tabelle esterne
elimina query in Oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e0.htm