IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

clause LIMIT dans une requête UPDATE


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    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.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    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.

  3. #3
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    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.

  4. #4
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE generate SET ident = "iUdhgdtrfefFDfg5fdf5gc2g46fg" LIMIT 500

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de double limite dans une requête mysql
    Par bbbbruno dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/01/2009, 19h21
  2. Problème clause "like" dans une requête
    Par the-player777 dans le forum Requêtes et SQL.
    Réponses: 21
    Dernier message: 16/01/2008, 16h58
  3. Clause IF dans une requête
    Par Asdorve dans le forum Langage SQL
    Réponses: 7
    Dernier message: 31/08/2007, 15h43
  4. [MySQL] nombre d'enregistrements maj dans une requête update
    Par erwan.bodere dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/06/2006, 16h11
  5. Inclure un SELECT dans une requète Update
    Par carolinebelle dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/07/2005, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo