|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() |
Bonjour,
Je vien du forum PHP ou on m'a renvoyé par ici.. Est-ce que quelqu'un saurait si il existe une fonction equivalente à MySQL mysql_insert_id() pour postgres? à savoir qui retournerai l'identifiant d'un tupple que l'on vient d'inserer sans avoir a passer une nouvelle requete? merci ps : le post relatif dans le forum php |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Bonjour,
Dans Postgres, je ne crois pas qu'il y ait de fonction d'auto incrément comme dans MySQL. Les clefs peuvent être générées par des séquences. Donc, si tu as le nom de l'objet séquence utilisé sur ta table, l'instruction currval('nom_sequence') renvoit la dernière valeur employée par cette séquence. ced |
|
|
00
|
|
|
#3 |
|
Nouveau Membre du Club
![]() |
l'instruction currval('nom_sequence') est une instruction SQL non?
Si je veux l'utiliser il faut que je fasse une requete SQL..ça revient plus ou moin au meme que de refaire un select |
|
|
00
|
|
|
#4 |
|
Membre émérite
![]() ![]() Inscription : mai 2002 Messages : 727 ![]() |
Salut
ced, ta méthode peut poser problème car l'INSERT et le SELECT qui suit ne sont pas effectués de façon atomique. Si une nouvelle ligne est insérée dans la table entre les deux instructions, le SELECT renverra la mauvaise valeur. Il ne reste que deux solutions:
__________________
Smortex Les FAQ Assembleur - Linux In The Beginning Was The Command Line Neal Stephenson |
|
|
00
|
|
|
#5 | ||
|
Membre actif
![]() Développeur multimédia Inscription : avril 2007 Messages : 175 ![]() |
Smortex, de spéculer qu'un insert puisse se produire entre un insert et un select (surtout sur une séquence) est un peu (beaucoup !!) improbable. A part si on bosse sur une application d'environ une centaine d'accès à la seconde !! Je crois que seul SourceForge.com peut se vanter de ça.
Bien sûr, comme tu l'as indiqué, on peut également utiliser la forme suivante : J'ai une table jour avec id_jour en serial : Code :
|
||
|
|
00
|
|
|
#6 | |
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Citation:
budtucker >> compter sur la chance pour que la base conserve son intégrité est s'exposer tôt ou tard à un rappel douloureux de la Loi de Murphy...
__________________
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 |
|
|
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() |
Merci beaucoup pour toutes ces réponses,
je vais voir si il est possible de mettre en place l'extension returning sur la BD que j'utilise, ce serait l'ideal encore merci a vous tous |
|
|
00
|
|
|
#8 |
|
Invité(e)
Messages : n/a ![]() |
L'aggrégat 'RETURNING' est vraiment intéressant. Le problème est si l'on veut migrer vers un autre SGBD, ça ne sera pas interprété !!
La ou les requetes seront bonnes à refaire! |
00
|
|
|
#9 |
|
Nouveau Membre du Club
![]() |
dans mon cas précis ça ne pose pas de probleme il est possible qu'il y ait migration des données vers une autre architecture de la base, mais le moteur restera posgres, donc le returning me convient parfaitement
|
|
|
00
|
|
|
#10 |
|
Membre régulier
![]() |
Euh est-ce que la fonction nextval() ne sert pas précisément à ce genre de situation ?
Je veux dire: On commence par puis: Code :
INSERT INTO TABLE ( id, col2, col3, ... ) VALUES ( [résultat de la requête du dessus], val2, val3, ... ); Dites moi si je me trompe svp |
|
|
00
|
|
|
#11 |
|
Nouveau Membre du Club
![]() |
Pour recadrer un peu les choses : mon but était d'essayer de diminuer le nombre de requetes, passer de 3 à 2 :
- Un select pour vérifier l'existance du tupple - Un insert pour inserer le tupple - Un select pour récupérer l'identifiant pour la derniere requete que je fasse un select classique ou un SELECT NEXTVAL('sequence');, cela ne change rien, j'ai toujours 3 requetes... ...alors qu'avec le returning, la 3eme requete n'est plus nécessaire. J'aurais été en php5 j'aurais pu tout faire avec une seule requete, mais malheuresement ce n'est pas le cas :'( |
|
|
00
|
|
|
#12 |
|
Membre régulier
![]() |
En effet ça ne change rien du point de vue du nombre de requêtes, j'avais pas compris le débat désolé
|
|
|
00
|
|
|
#13 | ||
|
Membre émérite
![]() ![]() Inscription : mai 2002 Messages : 727 ![]() |
Citation:
Citation:
__________________
Smortex Les FAQ Assembleur - Linux In The Beginning Was The Command Line Neal Stephenson |
||
|
|
00
|
|
|
#14 | ||
|
Nouveau Membre du Club
![]() |
Citation:
non ce que j'entendais par par Citation:
mais au final 2 requetes sont nécessaires, on est d'accord |
||
|
|
00
|
|
|
#15 | |
![]() ![]() |
Bonjour !
Je me permets de faire remonter le sujet, car il n'a pas vraiment été apporté de réponse à la question initiale (dont la réponse m'intéresse (si si si sans déconner )) :Citation:
S'il n'y a toujours pas d'autres moyens que ceux énoncés dans ce topic, je me résignerai, la mort dans l'âme, à truander Merci d'avance.
__________________
Vous postez du code ? Merci d'utiliser les balises [CODE] ... [/CODE] Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif ![]() Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag ![]() [ En cas de besoin retrouvez moi sur l'AnoChat ] __________________ Ingénieur R&D, diplômé en 2007 de l'ISIMA Doctorant à l'EDSPI de Clermont-Ferrand, depuis 2011. |
|
|
00
|
|
|
#16 | |||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Citation:
1) entre la requête 1 et la 2 les données peuvent changer du fait des actions concurrentes des utilisateurs. Le risque est donc énorme d'obtenir une incohérence de la base de données tôt ou tard.... et je vous renvoie sur le commentaire précédent : http://www.developpez.net/forums/d36...e/#post2256364 (loi de Murphy) Le plus simple est d'incorporer la requête 1 dans la 2. Exemple : Ensuite compter le nombre de ligne insérées... ceci est faisable pour toute requête du côté client, comme du côté serveur ! Code :
Dans ce sens l'utilisation des procédures stockées (Dans PostGreSQL ce sont des fonctions) ne peut que vous apporter des bienfaits et répondre aux deux problématiques.... A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|||
|
00
|
|
|
#17 |
![]() ![]() |
Pour répondre à la question initiale, je crois que la requête suivante doit renvoyé le résultat souhaité :
__________________
Vous postez du code ? Merci d'utiliser les balises [CODE] ... [/CODE] Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif ![]() Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag ![]() [ En cas de besoin retrouvez moi sur l'AnoChat ] __________________ Ingénieur R&D, diplômé en 2007 de l'ISIMA Doctorant à l'EDSPI de Clermont-Ferrand, depuis 2011. |
|
00
|
|
|
#18 |
![]() ![]() |
Je repasse en coup de vent pour confirmer que cette requête retourne effectivement le résultat souhaité
__________________
Vous postez du code ? Merci d'utiliser les balises [CODE] ... [/CODE] Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif ![]() Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag ![]() [ En cas de besoin retrouvez moi sur l'AnoChat ] __________________ Ingénieur R&D, diplômé en 2007 de l'ISIMA Doctorant à l'EDSPI de Clermont-Ferrand, depuis 2011. |
|
00
|
Copyright © 2000-2012 - www.developpez.com