In einem Versuch, einen groß angelegten Aktualisierungsvorgang für eine MyISAM-Tabelle zu optimieren, Ein Entwickler nutzte die CASE-Funktion. Die Abfrage zeigte jedoch unerwartetes Verhalten, was sich auf die Leistung auswirkte und sich auf alle Zeilen in der Tabelle auswirkte, auch auf diejenigen, die nicht explizit in der CASE-Anweisung erwähnt wurden.
Die erste Abfrage:
UPDATE `table` SET `uid` = CASE WHEN id = 1 THEN 2952 WHEN id = 2 THEN 4925 WHEN id = 3 THEN 1592 END
Unerwarteterweise Diese Abfrage hat jede Zeile in der Tabelle mit 25 Millionen Datensätzen aktualisiert und alle nicht angegebenen Zeilen auf NULL gesetzt. Dieses Verhalten widerspricht der erwarteten Funktionalität der CASE-Anweisung, bei der nicht erwähnte Zeilen unverändert bleiben sollten.
Der Grund für dieses unerwartete Ergebnis liegt im Fehlen einer ELSE-Klausel in der CASE-Anweisung. Wenn die ID einer Zeile keiner der angegebenen Bedingungen entspricht, wird der CASE-Ausdruck als NULL ausgewertet. Folglich aktualisiert MySQL alle Zeilen mit NULL, unabhängig davon, ob sie ursprünglich in der CASE-Anweisung angegeben wurden.
Um dieses Problem zu beheben und eine gezielte Aktualisierung durchzuführen, sollte die Abfrage eine ELSE-Klausel enthalten:
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)
Die aktualisierte Abfrage fügt der CASE-Anweisung eine ELSE-Klausel hinzu, um sicherzustellen, dass alle nicht erwähnten Zeilen ihren ursprünglichen Wert für uid behalten. Darüber hinaus wird eine WHERE-Klausel eingeführt, um den Aktualisierungsvorgang nur auf die angegebenen IDs (1, 2 und 3) zu beschränken und so die Effizienz durch die Begrenzung der betroffenen Zeilen weiter zu verbessern.
Das obige ist der detaillierte Inhalt vonWarum wirkt sich mein MySQL CASE WHEN-Update auf alle Zeilen aus und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!