Oracle
 sql >> Base de données >  >> RDS >> Oracle

Contrainte unique ORA-00001 violée

ORA-00001 la contrainte unique violée est l'un des messages courants que nous recevons souvent lors du chargement de données.

Cette erreur de violation de contrainte unique ORA-00001 se produit lorsque vous avez essayé d'exécuter une instruction INSERT ou UPDATE qui a créé une valeur en double dans un champ restreint par un index unique.

Liste de vérification à exécuter pour résoudre ORA-00001

Nous pouvons effectuer les éléments d'action suivants pour cet ORA-00001

(1) Vous pouvez regarder l'erreur et trouver les informations de contrainte avec le sql ci-dessous

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>'

Nous pouvons maintenant vérifier les données existantes avec les données que nous insérons, puis agir en conséquence. Vous pouvez modifier les clés afin qu'elles puissent être insérées

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)  Nous pouvons supprimer la contrainte si les doublons sont autorisés dans le tableau

Exemple

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

(3) L'indice 11gr2 ignore_row_on_dupkey_index permet à l'instruction d'ignorer silencieusement les erreurs ORA-00001.

  • L'indicateur IGNORE_ROW_ON_DUPKEY_INDEX est différent des autres indicateurs en ce sens qu'il a un effet sémantique. La philosophie générale expliquée dans "Conseils" ne s'applique pas à ces trois conseils.
  • L'indicateur IGNORE_ROW_ON_DUPKEY_INDEX s'applique uniquement aux opérations INSERT sur une seule table. Il n'est pas pris en charge pour les opérations UPDATE, DELETE, MERGE ou d'insertion multitable. IGNORE_ROW_ON_DUPKEY_INDEX oblige l'instruction à ignorer une violation de clé unique pour un ensemble de colonnes spécifié ou pour un index spécifié. Lorsqu'une violation de clé unique est rencontrée, une annulation au niveau de la ligne se produit et l'exécution reprend avec la ligne d'entrée suivante. Si vous spécifiez cet indice lors de l'insertion de données avec la journalisation des erreurs DML activée, la violation de clé unique n'est pas enregistrée et n'entraîne pas l'arrêt de l'instruction.

L'effet sémantique de cet indice entraîne des messages d'erreur si des règles spécifiques sont violées :

  • Si vous spécifiez index, l'index doit exister et être unique. Sinon, l'instruction provoque ORA-38913.
  • Vous devez spécifier exactement un index. Si vous ne spécifiez aucun index, l'instruction provoque ORA-38912. Si vous spécifiez plus d'un index, l'instruction provoque ORA-38915.
  • Vous pouvez spécifier un indicateur CHANGE_DUPKEY_ERROR_INDEX ou IGNORE_ROW_ON_DUPKEY_INDEX dans une instruction INSERT, mais pas les deux. Si vous spécifiez les deux, l'instruction provoque ORA-38915.
  • Comme pour tous les conseils, une erreur de syntaxe dans le conseil entraîne son ignorance silencieuse. Le résultat sera que ORA-00001 sera causé, comme si aucun indice n'était utilisé.
insert /*+ ignore_row_on_dupkey_index(unique_table, unique_table_idx) */
into
unique_table
(select * from non_unique_table);

Articles connexes

ORA-00911 :caractère invalide
ORA-03113 :fin de fichier sur le canal de communication
ORA-00257
ORA-29285 :erreur d'écriture de fichier
ORA-29913 avec des tables externes
supprimer la requête dans oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e0.htm