Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité régulier
    Profil pro Steph S
    Inscrit en
    novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Nom : Steph S

    Informations forums :
    Inscription : novembre 2009
    Messages : 12
    Points : 5
    Points
    5

    Par défaut PostgreSQL, Serial et Placeholder

    Bonjour,

    Je suis venu rapporter quelques chose qui me déconcerte (et je n'ai malheureusement trouvé la réponse nulle part) :
    Est-il normal que lors de l'utilisation de tables munies de séquences postgreSQL (type SERIAL) conjointe à celle de placeholders pour insérer les données en base la première valeur insérée dans la séquence soit "2".

    Ma séquence est initialisée avec "1" comme valeur de départ, et doit s'incrémenter de 1 à chaque pas (ce qui est effectivement le cas).

    Côté perl, ma requête est préparée une unique fois, et exécutée à chaque insertion.
    Tout se déroule parfaitement bien, si ce n'est que la première valeur rendue par mes séquences est toujours "2".

    Quelqu'un a-t-il déjà observé un comportement similaire ?

  2. #2
    Invité régulier
    Profil pro Steph S
    Inscrit en
    novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Nom : Steph S

    Informations forums :
    Inscription : novembre 2009
    Messages : 12
    Points : 5
    Points
    5

    Par défaut

    Bonjour à tous,

    j'ai finalement trouvé la réponse à ce précédent post.
    Si vous utilisez, une interface de gestion (comme phpPgAdmin) pour réinitialiser une séquence il se passera exactement ce qui est décrit ci-dessus. La séquence est réinitialisée comme suit :
    Code :
    1
    2
    3
    4
    5
    # select * from seq_foo;
    sequence_name     | last_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called 
    ----------------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
    seq_foo           |          1 |            1 | 9223372036854775807 |         1 |           1 |       1 | f         | t
    (1 row)
    Ce type de réinitialisation n'utilise pas la clause optionnelle "RESTART WITH start" qui modifie la valeur courante de la séquence et set "is_called" à "false".

    Donc, pour commencer par "1", il suffit d'appliquer à votre séquence :
    Code :
    # ALTER SEQUENCE seq_foo RESTART WITH 1;
    Et ainsi, la valeur passée à la requête lors de la première insertion sera bien "1".
    Code :
    1
    2
    3
    4
    5
    # select * from seq_foo;
    sequence_name     | last_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called 
    ----------------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
    seq_foo           |          1 |            1 | 9223372036854775807 |         1 |           1 |       1 | f         | f
    (1 row)

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •