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.