Maison > base de données > tutoriel mysql > Pourquoi ma mise à jour MySQL CASE WHEN affecte-t-elle toutes les lignes et comment puis-je y remédier ?

Pourquoi ma mise à jour MySQL CASE WHEN affecte-t-elle toutes les lignes et comment puis-je y remédier ?

Patricia Arquette
Libérer: 2024-12-03 08:12:14
original
585 Les gens l'ont consulté

Why Does My MySQL CASE WHEN Update Affect All Rows, and How Can I Fix It?

Mise à jour MySQL à l'aide de CASE WHEN/THEN/ELSE : conséquences inattendues et solution affinée

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
Copier après la connexion

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal