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

Requêtes PostgreSQL Discussion :

duplicate key value violates unique constraint "pk_ch0_id"


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre averti Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Points : 304
    Points
    304
    Par défaut duplicate key value violates unique constraint "pk_ch0_id"
    Bonjour, une erreur que je n'arrive pas a comprendre m'empeche d'inserer de nouvelles valeurs dans une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE chap0_part2_ch0
    (
      ch0_id serial NOT NULL,
      ch0_pere integer,
      ch0_position integer,
      ch0_niveau smallint,
      ch0_texte text,
      ch0_titre character varying(100),
      use_id integer,
      CONSTRAINT pk_ch0_id PRIMARY KEY (ch0_id)
    )
    WITH (OIDS=FALSE);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    insert into chap0_part2_ch0 (ch0_position, ch0_pere, ch0_niveau, 
    ch0_texte, ch0_titre, use_id) values (
    (select cast(coalesce(max(ch0_position),0)as integer) +1 from 
    chap0_part2_ch0 
    where ch0_pere = 0), 0, 0, 'un texte', 'un titre', 2)
    que je procède a un nouvel enregistrement de maniere manuelle ou par le requeteur pgAdmin ou bien par le code de mon appli, j'ai une erreur (citée dans le titre du post)
    je ne comprends vraiment pas pourquoi j'ai cette erreur sur cette table on ne plus simple alors que les autres tables quasi identiques ne me posent aucun probleme.

    Merci de m'aider

  2. #2
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    L'erreur vous indique que vous essayez d'insérer une valeur doublon pour le champ ch0_id.

    D'ailleur, si je comprends bien le cast(coalesce(max(ch0_position),0)AS integer) +1, si le max(ch0_position) est null, vous insérez 1. Il est fort possible que cette valeur existe déjà.

    Enfin, je vous conseille d'utiliser des autoincréments.

    Cordialement,

    Arkhena
    A bove ante, ab asino retro, a stulto undique caveto

  3. #3
    Membre averti Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Points : 304
    Points
    304
    Par défaut
    Meme cette partie du cast, remplacée par 1 ne fonctionne pas
    l'auto-incrémentation est bien evidemment mise en place puisque le champs ch0_id est de type "SERIAL".

    l'erreur ne se produit pas sur le champs "ch0_position" (cast), mais bien sur le champs PRIMARY KEY (ch0_id) ou la valeur DEFAULT est theoriquement prise en compte par le SGBDR puisque de type SERIAL

    pour rappel, le coalesce permet justement de transformer un NULL en 0+1 dans ce cas précis. mais l'erreur ne vient pas de cette function.

  4. #4
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut

    Au temps pour moi, j'ai dit une énorme connerie!
    A bove ante, ab asino retro, a stulto undique caveto

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par The_Big_Lebowski Voir le message
    Meme cette partie du cast, remplacée par 1 ne fonctionne pas
    l'auto-incrémentation est bien evidemment mise en place puisque le champs ch0_id est de type "SERIAL".

    l'erreur ne se produit pas sur le champs "ch0_position" (cast), mais bien sur le champs PRIMARY KEY (ch0_id) ou la valeur DEFAULT est theoriquement prise en compte par le SGBDR puisque de type SERIAL
    La séquence liée à la colonne ch0_id et le contenu de cette colonne sont désynchronisés: la séquence est "en retard" par rapport aux données. En principe ça ne peut arriver que par des insertions ou modifications qui ne passent par la séquence et qui ne la mettent pas à jour alors qu'elles devraient.

  6. #6
    Membre averti Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Points : 304
    Points
    304
    Par défaut
    Merci,
    et comment puis-je "synchroniser" la séquence ?
    quel est le phénomène qui met la séquence en "retard" ?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par The_Big_Lebowski Voir le message
    Merci,
    et comment puis-je "synchroniser" la séquence ?
    Pour remettre la séquence à jour utiliser la fonction setval avec la valeur maximum de la colonne concernée dans la table.

  8. #8
    Membre averti Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Points : 304
    Points
    304
    Par défaut
    Merci, j'ai trouvé quelque chose la dessus
    Comment se fait-il que j'ai ce probleme ?
    Pourquoi le fait de creer un champs SERIAL, ne permet pas justement de faire cette incrémentation automatique ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/03/2011, 18h25
  2. Erreur 'value violates unique constraint'
    Par miniBob dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 23/06/2009, 20h06
  3. Erreur sql duplicate key violates unique constaint
    Par valvalval dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/06/2008, 23h15

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