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 :

[auto-incrémentation] récupérer la valeur insérée


Sujet :

PostgreSQL

  1. #1
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut [auto-incrémentation] récupérer la valeur insérée
    Bonjour, je souhaiterai savoir s'il est possible de récupérer la valeur générée par postgres, dans le cas d'une clef primaire serial.

    ... et ceci au travers d'une connexion JDBC d'un programme Java.

    Merci d'avance

    Thomas

  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
    Bonjour,

    Dans la même transaction et après ta requête INSERT, lance la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select currval('nom_de_la_sequence') as nouv_id;
    nouv_id contiendra la dernière valeur de la séquence correspondant à ton champ serial

  3. #3
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Ok merci beaucoup. Du coup j'ai une question de newbie : comment puis-je déterminer le nom de la séquence ? Il me le donne au moment de la création de la table c'est ça ? Mais y-a-t'il un moyen de le déterminer à postériori ?

  4. #4
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Et dans le cas d'accès concurrent, y-a-t'il un risque que la valeur soit périmée quand je la lis ? Ou bien le fait d'y accéder dans la même transaction que l'insert me garantie que ça sera la bonne valeur ?

  5. #5
    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
    Citation Envoyé par laffreuxthomas
    comment puis-je déterminer le nom de la séquence ? Il me le donne au moment de la création de la table c'est ça ? Mais y-a-t'il un moyen de le déterminer à postériori ?
    Tu peux déduire le nom de la séquence en ajoutant le suffixe '_seq' au nom de ton champ serial (tu as également la possibilité de créer ta séquence manuellement et de choisir son nom, mais c'est rarement utile)
    Et dans le cas d'accès concurrent, y-a-t'il un risque que la valeur soit périmée quand je la lis ?
    D'autres sessions peuvent effectivement faire appel entre temps à la fonction nextval(), qui incrémente la séquence et renvoie la nouvelle valeur. Cependant, nextval() est atomique et renvoie une valeur distincte du compteur à chaque session qui l'utilise. Il n'y a donc pas de risque de conflits entre les sessions. Par contre, tu n'as pas de garantie que le numéro renvoyé par currval() est bien celui actuellement enregistré dans la séquence. Mais ce n'est pas grave, car tu es en revanche sûr que c'est bien celui renvoyé par le dernier nextval() dans ta session.
    Ou bien le fait d'y accéder dans la même transaction que l'insert me garantie que ça sera la bonne valeur ?
    L'inclusion de currval() dans une transaction n'est en rien une obligation et n'est qu'une suggestion de ma part ; elle s'appuie sur les principes suivants :

    - currval() renvoie une erreur si nextval() n'a pas été appelé au préalable dans la même session. En l'appelant après un INSERT, je suis sûr que nextval() a été appelé.

    - j'utilise essentiellement les SERIAL comme clés étrangères pour des relations maître/détails. Après l'INSERT initial dans la table maître suivront vraisemblablement des INSERT dans les tables détails avec la valeur renvoyée par currval(). En plaçant le tout dans une transaction, je m'assure de la consistence et de la robustesse de ma base.

    Un point important : il ne peut pas y avoir de rollback sur un nextval().

  6. #6
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Merci infiniment GrandFather !!!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/04/2011, 17h50
  2. [MySQL] Récupérer les valeurs insérées dans la dernière requête
    Par qwertyu dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/10/2009, 18h28
  3. [MySQL] récupérer une valeur auto incrémentée
    Par tonton51 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/06/2007, 15h23
  4. auto-référence : récupérer les valeurs.
    Par storm_2000 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/11/2006, 23h52
  5. [SQL] Récupérer simplement la valeur de l'id "auto incrémenté"
    Par yazerty dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/10/2006, 12h16

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