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

Exception de violation de contrainte ORA-00001

Une contrainte unique applique, eh bien, l'unicité. Il autorisera les valeurs nulles, contrairement à une contrainte de clé primaire .

Votre erreur signifie que vous insérez des données en double alors que la base de données a été configurée pour l'interdire explicitement.

Vous pouvez découvrir les contraintes d'une table en exécutant la requête suivante sur toutes_contraintes . Le lien décode la colonne CONSTRAINT_TYPE , par exemple P est une clé primaire et U une clé unique.

select *
  from all_constraints uc
 where uc.table_name = 'MY_TABLE'
   and owner = 'DBSCHEMA'

Pour savoir quelles colonnes se trouvent dans une contrainte, utilisez all_cons_columns à la place, ou en combinant les deux en une seule :

select uc.*, ucc.column_name, ucc.position
  from all_constraints uc
  join all_cons_columns ucc
    on uc.owner = ucc.owner
   and uc.table_name = ucc.table_name
   and uc.constraint_name = ucc.constraint_name
 where uc.table_name = 'MY_TABLE'
   and uc.owner = 'DBSCHEMA'

À l'une ou l'autre requête, vous pouvez ajouter la condition supplémentaire and constraint_name = 'IDX_CO_DETAILS' pour connaître les détails de la contrainte spécifique qui semble être à l'origine de votre problème.

Votre commentaire est un peu surprenant pour plusieurs raisons. Même une contrainte créée par le système, par exemple celle qui a été définie en ligne lors de la création de la table sans qu'un nom ne soit spécifié, doit apparaître. Aussi, le nom de la contrainte IDX... implique qu'il s'agit d'un index.

SI vous exécutez la requête suivante, elle devrait vous indiquer si l'objet existe dans la base de données :

select *
  from all_objects
 where object_name = 'IDX_CO_DETAILS'

Je m'attendrais à ce que le OBJECT_TYPE renvoyé par cette requête est 'INDEX' .

Ensuite, la requête suivante renverra chaque index portant ce nom, le type d'index, la table à laquelle il est associé et le propriétaire de cette table.

select *
  from all_indexes
 where index_name = 'IDX_CO_DETAILS'

A en juger par votre erreur, je m'attendrais en outre à ce que la colonne UNIQUNESS renvoyé par cette requête est 'UNIQUE' .

Cela devrait vous aider à localiser l'objet.

Vous pouvez également utiliser le package système dbms_metadata traquer le DDL de l'objet; attention, il renvoie un clob.

select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA') 
  from dual

le paramètre schema est facultatif.