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

PostgreSQL Discussion :

[débutant]auto incrémentation, pb!


Sujet :

PostgreSQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Points : 9
    Points
    9
    Par défaut [débutant]auto incrémentation, pb!
    j'ai décllaré les clé primaires de mes tables en type SERIAL.
    En théorie l'auto-incrémentation se fait de la manière suivante:
    1.recherche de la clé max dans la table,
    2.incrémentation
    3.insertion.

    or j'ai le message d'erreurs suivant: duplicate key violates unique constraint "pk_taxon".

    A priori l'insertion ne peut pas se faire car la clé primaire du tuple que je veux insérer est similaire à un tuble contenu dans la table.

    D'où peut venir le problème!

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    D'où peut venir le problème!
    Tu as donné toi même la solution

    A priori l'insertion ne peut pas se faire car la clé primaire du tuple que je veux insérer est similaire à un tuble contenu dans la table.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    normalement lors d'une insertion, la clé produite doit avoir une valeur différente de celles existantes. donc il ne devrait pas y avoir ce message d'erreur de clé déjà existante.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Il serait plus facile de t'aider si tu nous donnait la description de la table et le code d'insertion de ta ligne

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Il serait plus facile de t'aider si tu nous donnait la description de la table et le code d'insertion de ta ligne

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    une de mes tables où je veux faire une insertion


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    /*==============================================================*/
     
    /* Table : TAXON                                                */
     
    /*==============================================================*/
     
    create table TAXON (
     
    CODE_TAXON           SERIAL               not null,
     
    TAX_CODE_TAXON       INT4                 null,
     
    NOM_LATIN_TAXON      VARCHAR(30)          not null,
     
    NOM_COMMUN_TAXON     VARCHAR(30)          null,
     
    constraint PK_TAXON primary key (CODE_TAXON),
     
    constraint FK_TAXON_TAXON_SUP_TAXON foreign key (TAX_CODE_TAXON)
     
       references TAXON (CODE_TAXON)
     
       on delete restrict on update restrict
     
    );
    l'insertion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into taxon (tax_code_taxon,nom_latin_taxon,nom_commun_taxon) values (1,'toto','tata')\g

    En sachant que j'ai déjà rempli ma base et donc ma table avec des méta données aussi la clé externe taxe_code_taxon=1 existe!

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    En sachant que j'ai déjà rempli ma base et donc ma table avec des méta données aussi la clé externe taxe_code_taxon=1 existe!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    duplicate key violates unique constraint "pk_taxon".
    Sachant que le message d'erreur concerne pk_taxon, donc le champ code_taxon, je ne vois pas le rapport avec le champ taxe_code_taxon

    Mais bon, je pense avoir une idée du problème.
    Le fait de déclarer un champ de type SERIAL va avoir pour conséquence de créer automatiquement une séquence, c'est à dire une table spéciale qui va avoir pour tâche de conserver la dernière valeur utilisée pour le compteur. Cette table spéciale porte le nom de ton champ suivi de _seq (dans ton cas, ce devrait être CODE_TAXON_seq)

    A chaque insertion dans une table comportant un champ SERIAL, Postgres consulte la séquence correspondante, incrémente la valeur qu'elle contient et initialise le champ avec, et enregistre le résultat dans la séquence.

    Tu dis que tu as déjà rempli ta base, comment as-tu fait ? Si tu est passé par une commande COPY FROM, il faut savoir que cette commande ne met pas à jour les séquences. Il faut que ce soit toi qui mettes à jour le compteur, avec la dernière valeur utilisée en utilisant la fonction setval(nom_de_ta_sequence, valeur_du_compteur). Si la dernière valeur de compteur est 56, alors utilise la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT setval('CODE_TAXON_seq', 56);
    Attention : comme toutes les autres tables, l'accès aux séquences est réglé par des droits d'accès (GRANT)
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    j'ai rempli la base avec des fichiers qui contenaient déjà les clés et en utilisant l'instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into taxon values (...............)

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Ca ne change rien à mon explication. Tu peux aussi vérifier la valeur actuelle du compteur en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM CODE_TAXON_seq
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    j'ai regardé la table des clés et le numéro courant est de 1
    j'ai utilisé l'instruction que tu m'as donné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     select setval('taxon_code_taxon_seq', 3002)\g

    ensuite j'ai réessayé l'instruction initiale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Hydreco=# insert into taxon (tax_code_taxon,nom_latin_taxon,nom_commun_taxon) values (1,'toto','tata')\g
    et toujours la même erreur!
    duplicate key violates unique constraint "pk_taxon".............

  11. #11
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Si j'en crois le schéma de ta table, c'est code_taxon qui est de type SERIAL, et non pas taxon_code_taxon (au passage, le choix du nom de tes champs n'est pas très heureux, ce qui explique d'ailleurs ta confusion ). En conséquence, la requête à lancer est celle que je t'ai donnée au départ, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT setval('code_taxon_seq', 3002);
    Tu n'as pas eu de message d'erreur avec le setval que tu as tenté ?
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    c'est bon j'ai trouvé en fait la valeur 3002 n'était pas la max.

    A e propos c'est quoi l'instruction pour trouver la clé max?

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    c'est bon j'ai trouvé en fait la valeur 3002 n'était pas la max.

    A e propos c'est quoi l'instruction pour trouver la clé max?

  14. #14
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(CODE_TAXON) FROM TAXON
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    merci beaucoup!

Discussions similaires

  1. [Derby] [Débutant] champ auto-incrémenté possible ?
    Par Cassios dans le forum Autres SGBD
    Réponses: 5
    Dernier message: 24/06/2011, 15h43
  2. [EJB2.1 Entity] [Débutant] Champs auto-incrémenté (identity)et EJB
    Par Houbbba dans le forum Java EE
    Réponses: 9
    Dernier message: 04/04/2006, 19h15
  3. [débutant] auto-incrémentation
    Par Biosox dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 30/01/2006, 11h33
  4. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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