[MYSQL] UPDATE multiple sur une table [Résolu]

UPDATE multiple sur une table [Résolu] [MYSQL] - SQL/NoSQL - Programmation

Marsh Posté le 01-04-2004 à 00:55:36    

Salut
 
Est il possible de faire une mise à jour multiple d'une table en 1 seule requete ?
 
j'explique
 
j'ai une liste de couples val1/val2, il y en a près de 45000.
 
je souhaite faire un  
 
UPDATE table SET colonne2 = val2 WHERE colonne1 = val1 ;
 
Soit je fait une boucle qui fait 45000 requetes sur la base (pas glop), soit je prépare une seule requete qui fait tout
 
J'ai pensé à  
UPDATE table SET colonne2 = val2-1, colonne2 = val2-2, ... WHERE colonne1 = val1-1,  colonne1 = val1-2, ...;
 
savez vous comment faire car ma table fait plus de 300000 enregistrements.
 
Merci


Message édité par T509 le 01-04-2004 à 15:29:19

---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 01-04-2004 à 00:55:36   

Reply

Marsh Posté le 01-04-2004 à 01:33:54    

moi je vote pour la boucle. sinon imagine la taille de la requête...

Reply

Marsh Posté le 01-04-2004 à 01:38:29    

C'est bien là le souci, je ne suis pas sûr de pouvoir faire cela dans les 30s authorisées.
 
Si oui, le nombre de hits sur la base est enorme !


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 01-04-2004 à 01:59:56    

30 sec. t'as pas parlé de web. Mais d'un autre côté, si ce genre de traitement est "normal" (courant), il faudrait revoir la structure de données...
 
Au pire tu peux modifier le timeout ou bidouiller. je pense pas que tu fais ce genre de traitement tous les jours


Message édité par jagstang le 01-04-2004 à 02:00:10
Reply

Marsh Posté le 01-04-2004 à 02:20:40    

non effectivement, pas tous les jours, c'est pas le souci de bidouiller, mais autant apprendre et se poser les bonnes questions


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 01-04-2004 à 08:36:33    

T'as essayé de bencher si tu fais la boucle (fais gaffe à ce que colonne1 soit indexé) ?

Reply

Marsh Posté le 01-04-2004 à 10:16:46    

Si ta liste de couples est elle-même dans une table, tu peux le faire en recopiant dans une nouvelle table tout le contenu de l'ancienne, avec la colonne mise à jour par une jointure :
 
INSERT INTO table_new(colonne2, colonne1, autre_champ1, autre_champ2)
SELECT IFNULL(convert.val2, 0), colonne1, table_old.autre_champ1, table_old.autre_champ2
FROM table_old
LEFT JOIN convert ON table_old.colonne1=convert.val1
 
Le IFNULL permet de fixer la valeur 0 s'il n'y a pas de valeur correspondante dans convert pour une ligne de table_old :)  
 
L'intérêt de cette méthode dépend de la taille de tes tables [:proy]


Message édité par mrbebert le 01-04-2004 à 10:17:26
Reply

Marsh Posté le 01-04-2004 à 11:39:51    

Donc là tu m'expliques que je travailles sur 3 tables :  
table_old (colon1, colon2, colon3, colon4)
table_new (colon1, colon2, colon3, colon4)
convert (val1, val2)
 
et que la requête ci dessus va remplir table_new avec
(colon1, IF(table_old.colon1=convert.val1 alors convert.val2 sinon table_old.colon2), colon3, colon4)
 
Je vais voir essayer ceci
Merci


Message édité par T509 le 01-04-2004 à 11:41:10

---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 01-04-2004 à 12:49:28    

Il y a une nouvelle table (le résultat en quelque sorte), qui est chargée avec le résultat d'une jointure entre la table d'origine et la table de conversion :)

Reply

Marsh Posté le 01-04-2004 à 15:29:04    

Merci !!


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed