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 :

Sequences postgreSQL bug ?


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre très actif 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
    Par défaut Sequences postgreSQL bug ?
    Bonjour,
    je suis confronté à un probleme que je n'arrive pas a resoudre :
    au lancement du script de ma base dont voici un exemple ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE unites_unt
    (
      unt_id serial NOT NULL,
      unt_nom character varying(50) NOT NULL,
      unt_symbole character varying(5) NOT NULL,
      unt_position integer NOT NULL,
      CONSTRAINT cont_unt_id PRIMARY KEY (unt_id)
    )
    WITH (OIDS=FALSE);
    Pas de souci pour la creation de la table
    la sequence du champs serial est bien créée
    je lance une serie de requetes du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position) VALUES (1, 'Le forfait', 'Ft', 1);
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position) VALUES (2, 'L''unité', 'U', 2);
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position) VALUES (3, 'Le centimètre', 'Cm', 3);
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position) VALUES (4, 'Le décimètre', 'Dm', 4);
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position) VALUES (5, 'Le mètre', 'M', 5);
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position) VALUES (6, 'L''hectomètre', 'Hm', 6);
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position) VALUES (7, 'Le kilomètre', 'Km', 7);
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position) VALUES (8, 'Le mètre carré', 'M2', 8);
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position) VALUES (9, 'L''are', 'A', 9);
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position) VALUES (10, 'L''hectare', 'Ha', 10);
    ...
    Lorsque je lance une requete sans préciser l'Id du nouvel enregistrement, pSQL me retourne une erreur du type violation de contrainte sur le champs unt_id.
    Et en effet, lorsque je vérifie la sequence, celle-ci ne s'est pas incrémentée de 1
    Lorsque j'affiche les propriétés de la séquence dans pgAdmin, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      INCREMENT 1
      MINVALUE 1
      MAXVALUE 9223372036854775807
      START 1
      CACHE 1;
    Alors que je devrais avoir la propriété START = 11 puisque j'ai 10 enregistrements dans la table
    La sequence ne fontionne pas, enfin, je ne vois pas d'autre explication
    Y aurait-il quelqu un qui pourrait m'expliquer ce phénomène ?
    Merci

  2. #2
    Membre Expert
    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
    Par défaut
    La séquence liée au champ SERIAL n'est utilisée dans l'INSERT que si tu ne donnes pas toi-même une valeur. Ce n'est pas vrai que pour les SERIAL d'ailleurs c'est vrai pour toute valeur par défaut d'un champ.
    Généralement on omet carrément la colonne serial dans l'insert, comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO unites_unt (unt_nom, unt_symbole, unt_position)
     VALUES ('Le forfait', 'Ft', 1);
    Une autre méthode est d'utiliser le mot clef DEFAULT à la place de la valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO unites_unt (unt_id, unt_nom, unt_symbole, unt_position)
     VALUES (DEFAULT, 'Le forfait', 'Ft', 1);

  3. #3
    Membre très actif 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
    Par défaut
    Effectivement, je suis d'accord en ce qui concerne la valeur DEFAULT pour un champs comportant une valeur par défaut
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO unites_unt (unt_nom, unt_symbole, unt_position)
     VALUES ('Le forfait', 'Ft', 1);
    ne doit pas renvoyer d'erreur
    hors, j'ai une erreur sur la viloation de primary key
    et c'est logique puisque ma sequence ne s'incrémente pas, j'aimerais savoir pourquoi
    Dois-je créer ma table avec des instructions particulieres sur le champs unt_id ?
    lorsque je je lance la requete create table, j'ai un msg sql qui dit que la sequence et la primary key ont bien été créées
    je ne vois pas pourquoi la sequence ne s'incrémente pas automatiquement lors d'un INSERT

  4. #4
    Membre émérite 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
    Par défaut
    Bonjour,

    Estofilo a pourtant été clair : Vous n'avez pas fait appel à votre séquence lors des commandes INSERT. Vous avez donc entré des données (1 à 10) comme valeur pour unt_id.

    La séquence n'a pas été incrémentée car vous n'y avez pas fait appel. Du coup, votre séquence commence toujours à 1. Donc lorsque vous tentez d'insérer une nouvelle valeur à partir de cette séquence, il prend 1 et se rend compte que cette valeur est déjà attribuée pour ce champ. Ce champ étant clef primaire, il ne peut donc pas avoir de doublon.

    Il faut que vous réaffectiez la valeur de la séquence à 10 avec setval.

    Cordialement,

    Arkhena

  5. #5
    Membre très actif 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
    Par défaut
    Merci
    2 cerveaux ou plus valent mieux qu'un.

    En fait j'ai bien compris que mes requetes INSERT ne sollicitaient pas la séquence de l'auto-incrémentation de ma table.
    J'ai fait un autre test et ... ca fonctionne.
    Merci encore

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

Discussions similaires

  1. [PostgreSQL] Bug Migration PHP/PostgreSQL
    Par Tonyfr dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/01/2014, 16h08
  2. Problèmes avec les vues et les sequences postgresql
    Par choko83 dans le forum Requêtes
    Réponses: 4
    Dernier message: 28/09/2009, 21h17
  3. problème sequence avec postgresql
    Par nark07 dans le forum Accès aux données
    Réponses: 0
    Dernier message: 08/06/2009, 12h45
  4. BUG POSTGRESQL (info ou intox)
    Par geros dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 08/02/2008, 18h09

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