Dalam percubaan untuk mengoptimumkan operasi kemas kini berskala besar pada jadual MyISAM, pembangun menggunakan ciri CASE. Walau bagaimanapun, pertanyaan itu mempamerkan gelagat yang tidak dijangka, memberi kesan kepada prestasi dan menjejaskan semua baris dalam jadual, malah yang tidak disebut secara eksplisit dalam penyata CASE.
Pertanyaan awal:
UPDATE `table` SET `uid` = CASE WHEN id = 1 THEN 2952 WHEN id = 2 THEN 4925 WHEN id = 3 THEN 1592 END
Tanpa diduga, pertanyaan ini mengemas kini setiap baris dalam jadual dengan 25 juta rekod, menetapkan semua baris yang tidak ditentukan kepada NULL. Tingkah laku ini bercanggah dengan kefungsian yang dijangkakan bagi pernyataan CASE, di mana baris yang tidak disebut harus kekal tidak berubah.
Sebab untuk hasil yang tidak dijangka ini terletak pada ketiadaan klausa ELSE dalam pernyataan CASE. Apabila id baris tidak sepadan dengan mana-mana syarat yang ditentukan, ungkapan CASE menilai kepada NULL. Akibatnya, MySQL mengemas kini semua baris dengan NULL, tidak kira sama ada ia pada asalnya dinyatakan dalam penyata CASE.
Untuk membetulkan isu ini dan melaksanakan kemas kini yang disasarkan, pertanyaan harus mengandungi klausa 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)
Pertanyaan yang dikemas kini menambah klausa ELSE pada pernyataan CASE, memastikan bahawa semua baris yang tidak disebut mengekalkan nilai asalnya untuk uid. Selain itu, klausa WHERE diperkenalkan untuk mengehadkan operasi kemas kini kepada hanya id yang ditentukan (1, 2, dan 3), meningkatkan lagi kecekapan dengan mengehadkan baris yang terjejas.
Atas ialah kandungan terperinci Mengapa Kes MySQL Saya BILA Kemas Kini Mempengaruhi Semua Baris, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!