Requête multipliée ...

Discussion dans 'Web, design' créé par SkYlEsS, 3 Avril 2007.

Statut de la discussion:
Fermée.
  1. Offline
    SkYlEsS Kawai
    Bon, j'me remet un peu à coder mon site et paf' j'me rends compte que j'ai oublié pas mal de truc.

    Bref, j'ai besoin de purger ma base de donnée de tous les identifiants dont "ad_status" est égal à 1 et ce, dans chaque table. Comme j'ai 40 000 inscrits, je vais procéder par 500 pour ne pas tout faire exploser ...

    Comment faire ? Un while ? Un for ? Un 'LIMIT 500' fonctionnerait-il ?

    Code:
    $id_joueur = mysql_fetch_array(mysql_query("SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' LIMIT 500"));
    	
    		mysql_query("DELETE * FROM ad_joueurs WHERE id_joueur = '$id_joueur'");
    		mysql_query("DELETE * FROM ad_profils WHERE id_joueur = '$id_joueur'");
    		mysql_query("DELETE * FROM ad_fournitures WHERE id_joueur = '$id_joueur'");
    		mysql_query("DELETE * FROM ad_associes WHERE id_joueur = '$id_joueur'");
    		mysql_query("DELETE * FROM ad_secretaires WHERE id_joueur = '$id_joueur'");
    		mysql_query("DELETE * FROM ad_events WHERE id_joueur = '$id_joueur'");
    		mysql_query("DELETE * FROM ad_forum WHERE id_joueur = '$id_joueur'");
    		mysql_query("DELETE * FROM ad_verdicts WHERE id_joueur = '$id_joueur'");
    		mysql_query("DELETE * FROM ad_affaires WHERE id_joueur = '$id_joueur'");
    		mysql_query("DELETE * FROM ad_comp_won WHERE id_joueur = '$id_joueur'");
    SkYlEsS, 3 Avril 2007
    #1
  2. Offline
    Bingo Beer Addict
    A brûle pourpoint, un commentaire : n'importe quel moteur de base de données est capable de supprimer 40.000 enregistrements d'une table sans exploser !
    Bingo, 3 Avril 2007
    #2
  3. Offline
    guslinux Gamerz'ien
    Renseignes toi sur la clause "IN", mais je ne sias plus si ca marche avec un DELETE ...
    guslinux, 3 Avril 2007
    #3
  4. Offline
    AcidBird Touriste
    Comme dit Bingo, ca ne devrait pas poser de problème !

    Sinon, en transact SQL, tu as le TOP qui te permet de ne traiter que les x premier records qui doit être valabe pour le delete. Je crois que c'est limit en mySql mais je vais pas le jurer ...
    AcidBird, 3 Avril 2007
    #4
  5. Offline
    Calvin80 Elite
    perso je n'hesiterais pas une seconde: tout d'un coup.

    maintenant si tu n'est pas sur de ta requete...tu peux ajouter un champ 'deleted' avec un 'false' par défaut. Plutot qu'un delete tu faus un update deleted=true where...

    puis tu verifie que c ok, et si ça l'est , tu vires tout ce qui est deleted = true....

    mais comme dit gus:
    DELETE * FROM ad_joueurs WHERE id_joueur IN ( SELECT id_joueur FROM.....)
    Calvin80, 4 Avril 2007
    #5
  6. Offline
    SkYlEsS Kawai
    J'comprends pô trop cette fonction, tu sais m'en dire plus stp ?! (J'trouve pô d'infos valables là-dessus ...)

    Dans mon cas, comment dois-je m'y prendre ... ?
    SkYlEsS, 5 Avril 2007
    #6
  7. Offline
    La Poubelle Elite
    Il veut supprimer les sous tables en liant directement, mais avec une liaison comme ça, cela ne marchera pas.

    par contre,

    DELETE id_joueur as adProfils
    FROM ad_profils
    WHERE adProfils =(SELECT id_joueur as adJoueurs FROM ad_joueurs
    WHERE ad_status = '1' and adJoueurs = adProfils)
    La Poubelle, 5 Avril 2007
    #7
  8. Offline
    guslinux Gamerz'ien
    Tu ne peux pas mettre adProfils=(SELECT ...) car le SELECT va te renvoyer plus d'une valeur. A la place du "=" tu dois mettre "IN".
    guslinux, 5 Avril 2007
    #8
  9. Offline
    SkYlEsS Kawai
    DELETE id_joueur as adProfils
    FROM ad_profils
    WHERE adProfils IN (SELECT id_joueur as adJoueurs FROM ad_joueurs
    WHERE ad_status = '1' and adJoueurs = adProfils)

    ?
    SkYlEsS, 5 Avril 2007
    #9
  10. Offline
    La Poubelle Elite
    adJoueurs = adProfils
    La Poubelle, 5 Avril 2007
    #10
  11. Offline
    Calvin80 Elite
    ha ? :baille:
    Calvin80, 5 Avril 2007
    #11
  12. Offline
    Calvin80 Elite
    bien aprs_ le IN, tu dois mettre une liste d'id dont tu veux effacer les donnes..

    une liste est de la forme (id1,id2,id3,...)
    Calvin80, 5 Avril 2007
    #12
  13. Offline
    La Poubelle Elite
    Ton principe aurait été intéressant pour modifier des procédures stockées, mais ça n'a pas fonctionné :D

    Faut toujours tenter :p
    La Poubelle, 6 Avril 2007
    #13
  14. Offline
    Calvin80 Elite
    Procédure stockées ??? quel est le rapport ???

    je crois que j'ai rien compris au problème....

    je vois pas en quoi faire :
    puis en dernier
    ne résoud pas son problème ?

    on peut me dire que c'est pas optimisé, ça ok .
    Le mieux aurait été de faire un select into une table temporaire et de faire les jointures sur la table, et le mieux de mieux, ça aurait été de mettre ne foreign key pour chaque table avec une contrainte 'delete cascade'.
    Calvin80, 6 Avril 2007
    #14
  15. Offline
    Bingo Beer Addict
    Tu peux le faire en une seule fois je pense.

    Code:
    DELETE FROM 
    	ad_profils,
    	ad_fournitures,
    	ad_associes,
    	ad_secretaires,
    	ad_events,
    	ad_forum, 
    	ad_verdicts, 
    	ad_affaires, 
    	ad_comp_won
    USING 
    	ad_profils, 
    	ad_fournitures, 
    	ad_associes, 
    	ad_secretaires,
    	ad_events, 
    	ad_forum, 
    	ad_verdicts, 
    	ad_affaires, 
    	ad_comp_won, 
    	ad_joueurs
    WHERE ad_joueurs.ad_status = '1'
    	AND ad_profils.id_joueur = ad_joueurs.id_joueur
    	AND ad_fournitures = ad_joueurs.id_joueur 
    	AND ad_associes = ad_joueurs.id_joueur 
    	AND ad_secretaires = ad_joueurs.id_joueur
    	AND ad_events = ad_joueurs.id_joueur 
    	AND ad_forum = ad_joueurs.id_joueur 
    	AND ad_verdicts = ad_joueurs.id_joueur 
    	AND ad_affaires = ad_joueurs.id_joueur 
    	AND ad_comp_won = ad_joueurs.id_joueur;
    Ca n'existe pas sur des tables MyISAM il me semble ?
    Si on veut faire du SQL avancé (intégrité référentielle, procédure stockées, déclencheurs, etc...), le plus sage est de passer à un SGBD un peu plus puissant que MySQL.
    Avis personnel, évidemment ! ;)
    Bingo, 6 Avril 2007
    #15
  16. Offline
    La Poubelle Elite
    Ca passe en SQLServer Bingo ?
    La Poubelle, 6 Avril 2007
    #16
  17. Offline
    SkYlEsS Kawai
    Comme d'hab', la haine :

    DELETE FROM au lieu de DELETE * FROM ... :shut:
    SkYlEsS, 7 Avril 2007
    #17
  18. Offline
    SkYlEsS Kawai
    Oups, ma BDD a été trop sollicitée ... je crains qu'elle ne soit mise en quarantaine momenténament !

    Je vais encore devoir m'expliquer avec la hotline et faire des promesses comme les politiciens ;-D
    SkYlEsS, 7 Avril 2007
    #18
  19. Offline
    neku Codeur roumain
    Truncate Table ;)
    neku, 10 Avril 2007
    #19
  20. Offline
    Bingo Beer Addict
    Non c'est que du MySQL ça, c'est tout sauf standard ! :pfrt:
    Bingo, 10 Avril 2007
    #20
Statut de la discussion:
Fermée.