Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/01/2005, 20h45   #1
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
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
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2005, 15h18   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Bonjour,

Dans la même transaction et après ta requête INSERT, lance la requête :
Code :
SELECT currval('nom_de_la_sequence') AS nouv_id;
nouv_id contiendra la dernière valeur de la séquence correspondant à ton champ serial
__________________
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2005, 15h55   #3
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
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 ?
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2005, 15h57   #4
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
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 ?
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2005, 12h04   #5
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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)
Citation:
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.
Citation:
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().
__________________
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2005, 15h53   #6
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
Merci infiniment GrandFather !!!
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h29.


 
 
 
 
Partenaires

Hébergement Web