Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 12/12/2011, 15h33   #1
Membre confirmé
 
Homme Dominique
Première S
Inscription : juillet 2010
Messages : 252
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 15
Localisation : France

Informations professionnelles :
Activité : Première S

Informations forums :
Inscription : juillet 2010
Messages : 252
Points : 228
Points : 228
Par défaut clause LIMIT dans une requête UPDATE

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.
Dominique49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 16h48   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 18h20   #3
Membre confirmé
 
Homme Dominique
Première S
Inscription : juillet 2010
Messages : 252
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 15
Localisation : France

Informations professionnelles :
Activité : Première S

Informations forums :
Inscription : juillet 2010
Messages : 252
Points : 228
Points : 228
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.
Dominique49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 09h22   #4
Membre confirmé
 
Homme Dominique
Première S
Inscription : juillet 2010
Messages : 252
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 15
Localisation : France

Informations professionnelles :
Activité : Première S

Informations forums :
Inscription : juillet 2010
Messages : 252
Points : 228
Points : 228
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;
je me demande comment je n'ai pas pu penser plus tôt à une sous requête dans un IN ... surtout que j'ai déjà du le faire une fois.

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.
Dominique49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 11h06   #5
Membre confirmé
 
Homme Dominique
Première S
Inscription : juillet 2010
Messages : 252
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 15
Localisation : France

Informations professionnelles :
Activité : Première S

Informations forums :
Inscription : juillet 2010
Messages : 252
Points : 228
Points : 228
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
Dominique49 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 01h37.


 
 
 
 
Partenaires

Hébergement Web