Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3056 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Récupération d'une clé qui vient d'être insérée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Récupération d'une clé qui vient d'être insérée

n°977997
senomo
Posté le 10-02-2005 à 20:50:23  profilanswer
 

Bonjour à tous,
 
voici mon problème, dans une table mysql, la clé est un champs qui s'autoincrémente.
 
je fais ceci
 
insert into table
values (
'', 'moi') où le '' est la clé, pas la peine de rentrer une valeur puisque ce champs s'auto incrémente.
 
mon but après avoir fait cette insertion, est d'en récupérer la clé ha ha.
 
comment le faire puisqu'une selection UNIQUE ne se fait qu'à l'aide une clé :(
 
vous avez compris?

mood
Publicité
Posté le 10-02-2005 à 20:50:23  profilanswer
 

n°978104
Beegee
Posté le 10-02-2005 à 23:00:59  profilanswer
 

Google powaaaaa !
 
Recherche sur : mysql retrieve key autoincrement
 
2nd résultat : http://sunsite.mff.cuni.cz/MIRRORS [...] EMENT.html
 
=> "You can retrieve the used AUTO_INCREMENT key with the LAST_INSERT_ID() SQL function or the mysql_insert_id() API function."

n°978143
senomo
Posté le 10-02-2005 à 23:32:44  profilanswer
 

je te remercie pour la peine que tu t'es donnée, mais étant donné qu'il y aura des dizaines voir des centaines d'insertion par seconde je doute fort que cette méthode soit efficace.
 
sinon j'ai résolu le problème autrement. en fait j'explique ce que je voulais faire
 
je voulais créer un enregistrement d'une table "machin". à cet enregistrement je voulais associer 3 images dans une table "image" qui contient entre autre l'id de la table "machin". pour cela il me fallait l'id de la table "machin"
 
j'ai donc ajouté des champs qui correspondes aux 3 images dans la table "machin". c'est moins élégant mais efficace :)
 
en tout cas merci beegee ;)

n°978149
esox_ch
Posté le 10-02-2005 à 23:38:47  profilanswer
 

Je vois 2 methodes :  
 
1ere comme l'a dit beegee ... pour controler que c'est bien la bonne je crois que mysql possede une commande qui permet de mettre les requetes en file d'attente quand elles arrivent ... il suffirait donc de lancer les 2 requetes (insert + lastid) dans un meme paquet (pourquoi pas avec une requete preparée) ...
 
Sinon on peut le faire avec un ID unique ... genre ton insert tu lui met avec un temps en nanosec et c'est reglé


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°978210
Beegee
Posté le 11-02-2005 à 06:56:59  profilanswer
 

senomo a écrit :

je te remercie pour la peine que tu t'es donnée, mais étant donné qu'il y aura des dizaines voir des centaines d'insertion par seconde je doute fort que cette méthode soit efficace.


 
Je vois pas trop en quoi le fait d'insérer des centaines de lignes par seconde va poser un problème, tu devrais pouvoir faire des milliers d'insertion par seconde si tu fais juste des INSERT suivis de récupération de la clé (pour d'autres INSERT).
 
Et s'il te faut plus de perfs, regarde le lien que je t'ai passé, tu peux insérer en block, et récupérer le premier ID utilisé grâce à mysql _insert_id() (les autres en découlent logiquement ...).

n°978406
senomo
Posté le 11-02-2005 à 11:11:29  profilanswer
 

en gros si j'ai bien compris, l'insert et le last_id doivent être dans une même requête. intéréssant en effet, je n'y avais pas pensé.
 
merci beaucoup les gars :jap:

n°978485
sircam
I Like Trains
Posté le 11-02-2005 à 11:58:47  profilanswer
 

On dirait qu'on ne peut pas travailler avec de connection partagée si on utilise the LAST_INSERT_ID().
 
C'est un peu gênant, non ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°978563
moi23372
Posté le 11-02-2005 à 13:14:35  profilanswer
 

un
 
SELECT MAX(id) FROM nomtable;  
 
devrait faire l'affaire dans ton cas non en mysql!
 
perso c'est pas méga le bon plan étant donné que mysql c'est de la boos qui respecte rien...
 
sous oracle la technique pourrait etre la même, mais pour être sure que ce soit bien le dernier id encodé, on creerais une transaction juste avant afin que la donnée soit cohérente....


Message édité par moi23372 le 11-02-2005 à 13:16:53
n°978589
sircam
I Like Trains
Posté le 11-02-2005 à 13:34:31  profilanswer
 

moi23372 a écrit :

un
 
SELECT MAX(id) FROM nomtable;  
 
devrait faire l'affaire dans ton cas non en mysql!


Certainement pas !!! :o


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°978643
moi23372
Posté le 11-02-2005 à 13:59:41  profilanswer
 

si tu le dis

mood
Publicité
Posté le 11-02-2005 à 13:59:41  profilanswer
 

n°978652
FlorentG
Posté le 11-02-2005 à 14:06:20  profilanswer
 

moi23372 a écrit :


perso c'est pas méga le bon plan étant donné que mysql c'est de la boos qui respecte rien...


Pourquoi dis-tu que mysql ne respecte rien :??:

n°978676
sircam
I Like Trains
Posté le 11-02-2005 à 14:19:51  profilanswer
 


Tu peux prendre ça pour argent comptant.
 
Le INSERT suivi du SELECT MAX ne constituent pas une opération atomique. Entre ces deux opérations, un autre utilisateur/process peut avoir fait un INSERT, et le résultat de ton SELECT sera incorrect.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°978798
senomo
Posté le 11-02-2005 à 15:23:53  profilanswer
 

merci les gars pour toutes vos réponses, ce que j'ai fait, pour ne pas avoir à récupérer l'id, c'est d'insérer directement les 3 images dans la table sans créer une table propre aux images. je sais je me suis dégonflé trop tôt :(
mais ça marche :)
 
sinon vos remarques sont extrèmement constructives :jap:

n°978914
rompi
Posté le 11-02-2005 à 16:16:54  profilanswer
 

sircam a écrit :

Tu peux prendre ça pour argent comptant.
 
Le INSERT suivi du SELECT MAX ne constituent pas une opération atomique. Entre ces deux opérations, un autre utilisateur/process peut avoir fait un INSERT, et le résultat de ton SELECT sera incorrect.


 
 
OUi est c'est pour ca qu'on fait un LOCK avant le insert puis un UNLOCK apres le last_insert_id pour êter sûr de son coup!!!

n°978958
sircam
I Like Trains
Posté le 11-02-2005 à 16:35:37  profilanswer
 

rompi a écrit :

OUi est c'est pour ca qu'on fait un LOCK avant le insert puis un UNLOCK apres le last_insert_id pour êter sûr de son coup!!!


[:kiki] Super pour les perfs...


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°982134
rompi
Posté le 15-02-2005 à 13:35:47  profilanswer
 

C'est quoi ta solution "opération atomique" sircam ?
 
je n'ai jamais une de problème des problèmes de perf concernant, LOCK INSERT SELECT Last_insert_id() UNLOCK

n°982168
sircam
I Like Trains
Posté le 15-02-2005 à 13:59:59  profilanswer
 

Tu as donné la solution atomique toi-même. Simplement, ce qui précédait ne l'était pas (personne n'a parlé de LOCK).
 
Maintenant, revers de la médaille, obtenir un lock sur toute une table dégrade les performances. Tu n'as jamais eu de pb parce que dans la pratique, c'est uniquement dans le cas d'une charge maximale que cela se manifestera, sous forme d'un bottleneck pas toujours évident à détecter.
 
Ceci dit, je m'interroge sur la portée exacte du lock :

Citation :

LOCK TABLES locks tables for the current thread


Cela veut-il dire qu'un autre thread pourra malgré tout accéder à la table, malgré le lock ? Mes connaissances en MySQL s'arrêtent là mais ça vaut la peine de se poser la question.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°982172
latruffe
Bdovore
Posté le 15-02-2005 à 14:04:07  profilanswer
 

je dis peut-être une bétise mais j'avais vu une solution avec une ID temporaire...
 
Du genre : INSERT mes donnes +  monIDTemporaireQuiEstUnique
 
et récupération de l'ID auto-incrémentée par un SELECT monIDTemporaireQuiEstUnique...
 
Mais niveau perf, je sais pas ce que ça vaut...


---------------
« Lorsque le bûcheron pénétra dans la forêt avec sa hache, les arbres se dirent : ne nous inquiétons pas, le manche est des nôtres. » | Gérez votre collection de BD en ligne !

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Récupération d'une clé qui vient d'être insérée

 

Sujets relatifs
[html] envoi / recuperation de données de formulaireRécupération d'une trame IP ...
[DOS] Récupération dernière ligne d'un fichierrécupération d'un résultat d'une commande sous VBS
Recupération du flux video d'une camera ip[batch] - récupération du résultat d'une commande et traitement
récupération "à l'aveugle" de variables de formulaireprobleme de recuperation de session
Récupération[PHP][SQL]Double insertion et récuperation de champ
Plus de sujets relatifs à : Récupération d'une clé qui vient d'être insérée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR