Recupérer la clé créée lors d'un INSERT dans postgres

Recupérer la clé créée lors d'un INSERT dans postgres - SQL/NoSQL - Programmation

Marsh Posté le 10-08-2008 à 23:44:39    

Salut à tous, je m'en viens solliciter votre aide !
 
Voilà, une tite question, j'espère assez simple, mais qui me pose quelques soucis, je vous expose le sujet :  
Une base de données contient (entre autres) 2 tables Membre et Objet. L'idée de base, c'est qu'un membre possède des objets (subtil, n'est-ce pas  :D ) La clé de chacune de ces 2 tables est un identifiant, dans le cas de la table Objet c'est un type "serial" (chez Postgres, donc en fait c'est un entier à incrémentation automatique). Les cardinalités sont 0,n de chaque côté, donc je crée une table intermédiaire "possède" dont le clé est un ensemble id_membre + id-objet .
 
Via une interface web que je suis en train de créer (c'est dans le cadre d'un stage de fin d'année, je précise, sait-on jamais....), je veux permettre à un membre d'ajouter un objet, via un simple formulaire dans lequel il remplit les caractéristiques de l'objet. Une fois les infos rentrées, un peu de PHP, pg_connect tout ça, requete insert dans la table Objet. Donc, dans cette requete insert, je ne spécifie pas l'identifiant (puisque incrémenté), du coup ça donne un truc dans ce genre là :
INSERT INTO objet(Nom,Description, URL) VALUES ('truc', 'un super truc', 'www.truc.com');  
(je me marre un max avec mes requetes en ce moment, faut pas m'en vouloir :D  )
Le souci, c'est qu'en suite je voudrai ajouter le couple id_membre_connecté + id_objet_qu'on_vient-dinserer  dans la table "possède", et là je bloque... L'id du membre, pas de souci, elle est stockée dans un cookie, mais recupérer l'id de l'objet qu'on vient d'insérer... Erf  :/
 
Bref, je cale pas mal là, et j'ai du mal à faire des recherches efficaces sur le sujet (dur de compacter ça dans quelques mots...). Du coup, si quelqu'un pouvait éclairer ma lanterne, que ce soit via une solution toute prête ou un lien, ça m'aiderait vraiment !  (bon, je me dis que peut-être, via des triggers et/ou des transactions... Mais voilà, mon raisonnement est bloqué là !)
 
Merci !  :jap:


---------------
J'suis bien content que vous ayez des enceintes. C'est un objet tout simple, et pourtant !
Reply

Marsh Posté le 10-08-2008 à 23:44:39   

Reply

Marsh Posté le 12-08-2008 à 03:15:45    

"last inserted id serial posgres" dans google, quelques pages de lecture rapide et... http://www.postgresql.org/docs/7.3 [...] uence.html

Reply

Marsh Posté le 12-08-2008 à 12:17:58    

Trop cool, c'est exactement ce qu'il me fallait, merci !
Pour ceux qui se posent la même question que moi, il suffit d'utiliser la fonction currval() avec pour argument le nom de la séquence d'incrémentation  (dans mon cas currval(objet_id_seq) ) lors de l'insert suivant. Elle renvoie l'identifiant de la derniere insertion effectuée dans cette session. Donc ça gère automatiquement les accès concurents !  
Ca donnera donc
INSERT INTO possede VALUES (id_membre, currval(objet_id_seq));
 
Encore merci MagicBuzz !


---------------
J'suis bien content que vous ayez des enceintes. C'est un objet tout simple, et pourtant !
Reply

Marsh Posté le 12-08-2008 à 12:51:08    

mouais, moi ça me convainc pas trop, si t'as des triggers, toussa. Mieux vaut chopper un id d'abord, ensuite faire ses insert, etc.

Reply

Marsh Posté le 12-08-2008 à 12:54:57    

T'as la clause RETURNING qui fait exactement ce que tu veut  :  

Citation :

The optional RETURNING clause causes INSERT to compute and return value(s) based on each row actually inserted. This is primarily useful for obtaining values that were supplied by defaults, such as a serial sequence number.


http://www.postgresql.org/docs/cur [...] nsert.html


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-08-2008 à 14:51:31    

Hum, c'est pas faux pour les triggers, je me demande quelle insertion il considère en dernier dans ce cas...
Je me pencherai sur la clause returning quand j'aurai le temps ! Merci pour les réponses en tout cas :jap:


---------------
J'suis bien content que vous ayez des enceintes. C'est un objet tout simple, et pourtant !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed