Dans le but d'optimiser une opération de mise à jour à grande échelle sur une table MyISAM, un développeur a utilisé la fonctionnalité CASE. Cependant, la requête a présenté un comportement inattendu, impactant les performances et affectant toutes les lignes de la table, même celles qui ne sont pas explicitement mentionnées dans l'instruction CASE.
La requête initiale :
UPDATE `table` SET `uid` = CASE WHEN id = 1 THEN 2952 WHEN id = 2 THEN 4925 WHEN id = 3 THEN 1592 END
De façon inattendue, cette requête a mis à jour chaque ligne de la table avec 25 millions d'enregistrements, définissant toutes les lignes non spécifiées sur NULL. Ce comportement contredit la fonctionnalité attendue de l'instruction CASE, où les lignes non mentionnées doivent rester inchangées.
La raison de ce résultat inattendu réside dans l'absence de clause ELSE dans l'instruction CASE. Lorsque l'identifiant d'une ligne ne correspond à aucune des conditions spécifiées, l'expression CASE est évaluée à NULL. Par conséquent, MySQL met à jour toutes les lignes avec NULL, qu'elles aient été ou non spécifiées à l'origine dans l'instruction CASE.
Pour résoudre ce problème et effectuer une mise à jour ciblée, la requête doit inclure une clause ELSE :
UPDATE `table` SET `uid` = CASE WHEN id = 1 THEN 2952 WHEN id = 2 THEN 4925 WHEN id = 3 THEN 1592 ELSE `uid` END WHERE id in (1,2,3)
La requête mise à jour ajoute une clause ELSE à l'instruction CASE, garantissant que toutes les lignes non mentionnées conservent leur valeur d'origine pour l'uid. De plus, une clause WHERE est introduite pour limiter l'opération de mise à jour aux seuls identifiants spécifiés (1, 2 et 3), améliorant encore l'efficacité en limitant les lignes concernées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!