IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration Oracle Discussion :

violation de contrainte unique (KOLOK.IDCONFIG_PK)


Sujet :

Administration Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut violation de contrainte unique (KOLOK.IDCONFIG_PK)
    Bonjour à tous,

    je n'ai pas beaucoup de connaissances en Oracle, et je dois corriger cette erreur sous Oracle 9i :

    INSERT INTO config VALUES (NULL, 'glob_pjinbd', 'non')

    violation de contrainte unique (KOLOK.IDCONFIG_PK)

    je vous ai fait quelques screens de la config de la table qui pose problème :

    http://www.opensofts.org/temp/oracle_constraints.jpg
    http://www.opensofts.org/temp/oracle_indexes.jpg
    http://www.opensofts.org/temp/oracle_triggers.jpg

    le truc, c'est que j'ai une liste de 10 requêtes sous ce format. c'est jamais la même qui plante, et celles executées avant celle qui plante, ne posent pas de soucis.

    merci pour votre aide

  2. #2
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    ben c'est que tu essaies d'insérer une ligne avec pour clé primaire une valeur déjà existante ...

    Une clé primaire doit être unique dans une table ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    la clef primaire, c'est là ou je met NULL, et "normalement" le trigger devrait me trouver un ID. enfin, à ce que j'ai compris

    si je vide ma table config, et que je re execute ma 10ène de requêtes, avec des valeurs bien distinctes (même pour les autres champs, mais ça change rien), ça plante (mais jamais sur la même)

  4. #4
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par Sephiroth Lune
    la clef primaire, c'est là ou je met NULL, et "normalement" le trigger devrait me trouver un ID. enfin, à ce que j'ai compris
    Certes ! mais dans ce cas tu va récupérer la prochaine valeur de ta séquence...
    mais est-tu certains que cette séqence est à jour avec les ID de la table ?

    par exemple si je crée une séquence qui débute à un, puis insère 3 rows dans ma table SANS utiliser ma séquence (transfert d'une autre base) avec export/import par exemple j'aurais les ID de ces 3 rows (dison 9/10/11) qui existeront dans la table...

    donc ensuite les 8 premier inserts => OK, la séquence s'incrémente de 1 à 8, PUIS au prochain coup paf ! KO parce que la séquence va te proposer 9... mais 9 existe déjà !
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    je t'explique ma démarche :

    - on m'a filé un dump (.dmp) Oracle 9i d'une base de donnée qui a été remplie en utilisant les triggers / séquences
    - je remonte le dump sur un Oracle 9i, et là, j'ai ce problème
    - je peux pas te dire si en executant mes insert chez le client directement, sans passer par un export / import, ça fonctionne ou pas

    c'est pourtant une opération que l'on fait relativement souvent dans ma boite, et je n'ai pas encore eu ce problème. donc je me dis que ça provient de la base en elle même qui est pétée quelque part, mais je ne trouve rien.

    le plus bizarre, c'est que si comme tu le dis il y avait eu des insert sans utiliser la séquence, ça planterait toujours sur le même insert (pour reprendre ton exemple, celui qui veut prendre l'ID 9), alors que là, ça ne plante jamais sur le même

  6. #6
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    ok, mais est-ce que tu remonte ce dump dans des tables vides ou des tables qui contiennent déjà des lignes ?
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    ah attend, tu m'as mi la puce à l'oreille avec les insert sans passer par la séquence ... j'ai vérifié : le problème vient peut-être bien de là ! ma séquence a Last Value à 61, mais dans la table, j'ai déja les ID 62, 81, 82 et 101

    je vais chercher à savoir pourquoi, mais le problème provient surement de là.

    sinon, je remonte mon dump dans une base entièrement vierge (je détruit l'utilisateur et je le recréé à chaque fois)

    merci beaucoup

  8. #8
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    No problem !

    Il te suffit alors de désactiver ton trigger pour l'import, puis une fois les lignes importées tu va voir quel est l'ID maximum de tes lignes importées.

    Ensuite tu supprimes et recrée ta séquence en la commençant avec avec ton max + 1, tu recompile ton trigger (il sera invalide à cause de la suppression de la séquence), le réactive et le tour est joué !
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    les triggers et séquences sont refaites avec l'import

    je n'ai pas trouvé comment changer manuellement la valeur du trigger. donc je vais executer des .netval "dans le vent", pour le faire augmenter

    merci bien

  10. #10
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    tu as une façon plus simple que de faire plein de "nextval" :

    tu compte l'écart entre la valeur actuelle de la séquence et la valeur à atteindre, disons que ta séquence est à 61 et tu veux la positionner à 234, différence 173.
    là tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter sequence masequence increment by 173 ;
    puis UNE seule fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select masequence.nextval from dual ;
    ce qui va te faire sauter UNE SEULE ITERATION de 173 valeurs.

    Enfin tu repositionne le pas de la séquence à 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter sequence masequence increment by 1 ;
    et là c'est fini !
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    tout à fait, je n'y avais pas pensé.

    le FROM dual, ça veut dire quoi exactement ?

  12. #12
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Dual est une table système qui ne contient qu'une colonne et une ligne.

    Elle est utilisée justement dans ce genre de cas, ou pour exécuter une fonction dans un autre contexte que un Select "classique" ou une affectation de valeur à une variable.

    Attention à ne JAMAIS changer quoi que ce soit dans cette table !!
    nombre de process Oracle s'appuient dessus...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    oki, merci pour les explications

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ORA-00001: violation de contrainte unique
    Par other1234 dans le forum Forms
    Réponses: 5
    Dernier message: 08/05/2012, 20h16
  2. Réponses: 4
    Dernier message: 13/03/2012, 11h37
  3. Error ORA-00001: violation de contrainte unique
    Par delilou dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 17/03/2011, 17h26
  4. [hibernate] Violation de contrainte unique
    Par miyabi dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/06/2006, 14h52
  5. Réponses: 2
    Dernier message: 13/02/2006, 11h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo