Heim > Datenbank > MySQL-Tutorial > Warum wirkt sich mein MySQL CASE WHEN-Update auf alle Zeilen aus und wie kann ich das Problem beheben?

Warum wirkt sich mein MySQL CASE WHEN-Update auf alle Zeilen aus und wie kann ich das Problem beheben?

Patricia Arquette
Freigeben: 2024-12-03 08:12:14
Original
620 Leute haben es durchsucht

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

MySQL-Update mit CASE WHEN/THEN/ELSE: Unerwartete Konsequenzen und eine verfeinerte Lösung

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage