431 votes

Plusieurs Mises à jour dans MySQL

Je sais que vous pouvez insérer plusieurs lignes à la fois, il est un moyen de mettre à jour plusieurs lignes à la fois (comme dans, dans une requête) dans MySQL?

Edit: Par exemple, j'ai suivantes

Name   id  Col1  Col2

Je veux combiner toutes les Mises à jour suivantes en une requête


701voto

Michiel de Mare Points 15888

Oui, c'est possible - vous pouvez utiliser INSERT ... SUR un DOUBLE de la CLÉ de mise à JOUR.

À l'aide de votre exemple:

INSERT INTO table (id,Col1,Col2) VALUES (1,1,1),(2,2,3),(3,9,3),(4,10,12)

139voto

Harrison Fisk Points 3867

Puisque vous avez des valeurs dynamiques, vous devez utiliser un CAS ou de CAS pour les colonnes d'être mis à jour. Il obtient un peu laid, mais il devrait fonctionner.

À l'aide de votre exemple, vous pourriez faire comme:

UPDATE table SET Col1 = id de CAS 
 QUAND 1 DE 1 
 QUAND 2 DE 2 
 QUAND 4 PUIS 10 
 D'AUTRE Col1 
 FIN, 
 Col2 = id de CAS 
 LORS DE 3 DE 3 
 QUAND 4 PUIS 12 
 D'AUTRE Col2 
FIN
 OÙ id DANS (1, 2, 3, 4);

95voto

Roman Imankulov Points 1296

La question est vieille, mais je voudrais étendre le sujet avec une autre réponse.

Mon point est, le moyen le plus facile à atteindre, il est juste à enrouler plusieurs requêtes avec une transaction. La accepté de répondre INSERT ... ON DUPLICATE KEY UPDATE est un hack sympa, mais il faut être conscient de ses inconvénients et limites:

  • Comme dit, si vous arrivez à lancer une requête avec des lignes dont la principale clé n'existe pas dans la table, la requête permet d'insérer de nouveaux "mi-cuit" des dossiers. Probablement ce n'est pas ce que vous voulez
  • Si vous avez une table avec un pas de champ nul, sans valeur par défaut et ne voulez pas toucher ce champ dans la requête, vous obtiendrez "Field 'fieldname' doesn't have a default value" MySQL avertissement, même si vous ne l'insérez pas une seule ligne à tous. Il va vous causer des ennuis, si vous décidez d'être strict et tourner mysql avertissements des exceptions d'exécution de votre application.

J'ai fait quelques tests de performance sur les trois proposées, y compris les variantes de l' INSERT ... ON DUPLICATE KEY UPDATE variante, une variante avec des "cas / quand / puis, une clause" et une approche naïve de la transaction. Vous pouvez obtenir le code python et les résultats ici. La conclusion générale est que la variante avec l'instruction de cas s'avère être deux fois plus rapide que les deux autres variantes, mais il est assez difficile d'écrire à corriger et l'injection de code de sécurité pour elle, donc, personnellement, je en tenir à l'approche la plus simple: l'utilisation de transactions.

82voto

newtover Points 12301

Je ne sais pas pourquoi une autre option utile, n'est pas encore mentionné:

UPDATE my_table m
JOIN (
    SELECT 1 as id, 10 as _col1, 20 as _col2
    UNION ALL
    SELECT 2, 5, 10
    UNION ALL
    SELECT 3, 15, 30
) vals ON m.id = vals.id
SET col1 = _col1, col2 = __col2;

10voto

UnkwnTech Points 21942
UPDATE table1, table2 SET table1.col1='value', table2.col1='value' WHERE table1.col3='567' AND table2.col6='567'

Cela devrait fonctionner pour toi.

Il y est fait référence dans le manuel MySQL pour plusieurs tables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X