web-dev-qa-db-fra.com

problème ORA-00001: violation de la contrainte unique entrée dans INSERT/UPDATE

J'essaie d'insérer certaines valeurs dans la table via l'application et d'obtenir le problème ORA-00001: contrainte unique violée . Je constate que les séquences ne sont pas synchronisées avec l'id le plus élevé de la table, l'erreur persiste toujours. Comment puis-je déboguer cette erreur plus, les journaux Oracle donnent-ils plus d'erreur? Comment puis-je voir les journaux Oracle? Merci Priyank

update: nous utilisons le plug-in de journalisation d'audit et dans la classe de domaine pour l'utilisateur, nous saisissons l'événement de sauvegarde et enregistrons l'entrée dans le journal d'audit.

Donc, en classe utilisateur, nous faisons: 

class User {

//some attributes, constraints, mappings

def onSave = {
 Graaudit aInstance = new Graaudit();
         aInstance.eventType= "GRA User Create"
         aInstance.eventDescription = "GRA User Created"
         aInstance.objectid = username
         aInstance.objecttype = 'GRAUSER'
         aInstance.user_id = RequestContextHolder.currentRequestAttributes().session.username

          aInstance.withTransaction{
              aInstance.save()
          }
    }

}

Lorsque nous n'avons pas le code ci-dessus dans l'événement onSave, l'utilisateur est créé avec succès.
Je suppose qu’il s’agit d’une transaction liée au hibernation que nous utilisons une instance, celle-ci mourant ou la transaction en cours mourant à cause de cette sauvegarde.
Si nous n'utilisons pas la transaction, nous obtenons une exception "org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here" Vous ne savez pas comment résoudre ce problème .. Merci

5
pri_dev

Le message d'erreur inclura le nom de la contrainte qui a été violée (il peut y avoir plus d'une contrainte unique sur une table). Vous pouvez utiliser ce nom de contrainte pour identifier la ou les colonnes sur lesquelles la contrainte unique est déclarée.

SELECT column_name, position
  FROM all_cons_columns
 WHERE constraint_name = <<name of constraint from the error message>>
   AND owner           = <<owner of the table>>
   AND table_name      = <<name of the table>>

Une fois que vous savez quelles colonnes sont affectées, vous pouvez comparer les données que vous essayez d'utiliser INSERT ou UPDATE avec les données déjà présentes dans le tableau pour déterminer la raison pour laquelle la contrainte est violée.

10
Justin Cave

Cette erreur ORA est due à une violation de contrainte unique.

ORA-00001: contrainte unique (nom_contrainte) violée

Cela est dû à une tentative d'exécution d'une instruction INSERT ou UPDATE ayant créé une valeur en double dans un champ limité par un index unique.

Vous pouvez résoudre ce problème en modifiant la contrainte pour autoriser les doublons ou en supprimant la contrainte unique, ou vous pouvez modifier votre code SQL pour éviter les insertions en double.

Le message d'erreur d'Oracle devrait être un peu plus long. Cela ressemble habituellement à ceci:

ORA-00001: unique constraint (TABLE_UK1) violated

Le nom entre parenthèses est le nom de la constrait. Il vous dit quelle contrainte a été violée.

3
Codo

Le message d'erreur ressemble à ceci

Error message => ORA-00001: unique constraint (schema.unique_constraint_name) violated

ORA-00001 se produit dans les cas suivants: "une requête tente d'insérer une ligne" en double "dans une table". Une contrainte unique échoue. Par conséquent, la requête échoue et la ligne N'EST PAS ajoutée à la table. "

Solution:  

Recherchez toutes les colonnes utilisées dans unique_constraint, par exemple, la colonne a, la colonne b, la colonne c, la colonne d crée collectivement unique_constraint, puis recherchez l'enregistrement à partir des données source dupliquées à l'aide des requêtes suivantes:

-- to find <<owner of the table>> and <<name of the table>> for unique_constraint

select *
from DBA_CONSTRAINTS
where CONSTRAINT_NAME = '<unique_constraint_name>';

Puis utilisez la requête de Justin Cave (collée ci-dessous) pour trouver toutes les colonnes utilisées dans unique_constraint:

  SELECT column_name, position
  FROM all_cons_columns
  WHERE constraint_name = <<name of constraint from the error message>>
   AND owner           = <<owner of the table>>
   AND table_name      = <<name of the table>>

    -- to find duplicates

    select column a, column b, column c, column d
    from table
    group by column a, column b, column c, column d
    having count (<any one column used in constraint > ) > 1;

vous pouvez supprimer cet enregistrement dupliqué de vos données source (ce qui était une requête de sélection dans mon cas particulier, comme je l'ai expérimenté avec "Insérer dans la sélection"), ou le modifier pour le rendre unique ou modifier la contrainte.

0
Singh