|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre confirmé
![]() Dominique Première S Inscription : juillet 2010 Messages : 252 ![]() |
Bonjour,
je vous présente mon but : en fait, je voudrais récupérer disons ... 500 lignes au hasard dans une table ... et ces résultats sont destinés à être utilisés par un logiciel qui va les traités. Et la problématique, c'est que : - Si le logiciel est brutalement interrompu, le traitement sera perdu. C'est pourquoi il ne faut enlever les lignes traitées qu'une fois le traitement dûment terminé ! - Deuxièmement, il faut prévoir plusieurs instances du logiciel envoyant leurs requêtes en même temps : c'est pourquoi je ne peux pas récupérer un certain nombre de lignes avec SELECT UPDATE puis envoyer une deuxième requête pour marquer les lignes récupérées comme "en cours de traitement", car il pourrait y avoir conflit. bref, il faudrait que j'update un certains nb de ligne comme "en cours de traitement" et qu'une autre requête les récupère après. Seulement, je ne sais pas comment "updater un certains nb de ligne en récupérant leurs ID" ... voyez vous ce que je cherche à faire ? En fait c'est une base destinée à être traitée en même temps par beaucoup de logiciel (plusieurs PC en valent mieux qu'un merci d'avance. |
|
|
00
|
|
|
#2 |
![]() ![]() |
Il faudrait connaître la structure de la table pour qu'on puisse t'aider, et notamment savoir s'il y a une colonne accueillant le statut de la ligne (à traiter, en traitement, traité).
Processus à étudier : 1) Créer une table temporaire avec l'extraction des id des 500 lignes au hasard. 2) Dans la même transaction, UPDATE de la table sur les 500 lignes extraites et dont les id sont donc dans la table temporaire. 3) Traitement des 500 lignes dans la table en fonction de leur id figurant dans la table temporaire. 4) Passage à l'état "traité"des 500 lignes traitées.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#3 |
|
Membre confirmé
![]() Dominique Première S Inscription : juillet 2010 Messages : 252 ![]() |
Merci beaucoup, je n'avais en effet pas pensé au tables temporaires ... pour la bonne raison que je n'y connais rien (j'en ai juste entendu parler). Enfin, ça ne dois pas être très compliqué, je vais me renseigner
Pour la structure de la table, je vais faire simple, il y a disons les champs : 1 - id - primary key auto increment etc. 2 - data - les données à traités et autres infos complémentaires Le reste en fait j'ai encore rien décidé, mais il me paraît évident d'avoir un champs 'statut' comme tu le dis ... et en plus, je compte rajouter un champs 'der_modif' qui contiendrait la dernière date de mise à jour du statut, et dans la clause WHERE, il n'y aura pas seulement une condition sur le statut mais aussi sur cette date, pour que si un logiciel est brutalement interrompu, le statut expire au bout d'un certain temps ... difficile à expliquer ... enfin, en bref, ça permettrais de faire en sorte que le statut 'en cours de traitement' expire au bout d'un certain temps ... donc en résumé : - id (integer) - data (blob) - statut (int) - der_modif (datetime) merci, je vais me renseigner sur les tables temporaires ... et ... eh bien je verrais merci encore, à très bientôt. |
|
|
00
|
|
|
#4 |
|
Membre confirmé
![]() Dominique Première S Inscription : juillet 2010 Messages : 252 ![]() |
voilà, j'ai étudié la question ... et d'abord je n'ai trouvé que quelques exemples sur les tables temporaires, mais ça me suffit ...
et dans la FAQ MySQL, je me suit rendu compte que la technique des tables temporaires peu souvent être remplacée par des sous requête ... d'où il m'est venu cette idée de requête : Code :
UPDATE generate SET statut = 10 WHERE id IN (SELECT id FROM generate WHERE statut < 10 LIMIT 500);SELECT * FROM generate WHERE statut < 10 LIMIT 500; bon, ça me paraît bien je crois ... surtout que chaque instance du logiciel aura un identifiant. Comme cela le UPDATE attribuera l'identifiant à 500 lignes choisies par la sous requêtes, et après un SELECT viendra récupérer toutes les lignes qui portent cette identifiant ... qu'en penses-tu ? EDIT j'ai pas encore mis en application, je mettrais résolu dès que ça marchera. merci. |
|
|
00
|
|
|
#5 |
|
Membre confirmé
![]() Dominique Première S Inscription : juillet 2010 Messages : 252 ![]() |
hem ... euh ... je viens d'essayer un UPDATE avec une clause LIMIT à tout hasard ... et ça a marché ... peut-être es-ce que les nouvelles versions de MySQL supporte cela ... ?
en tout cas ça m'arrange bien, et désolé de vous avoir dérangé. @+ EDIT la requête testée : Code :
UPDATE generate SET ident = "iUdhgdtrfefFDfg5fdf5gc2g46fg" LIMIT 500 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com