Rumah > pangkalan data > tutorial mysql > Mengapa Kes MySQL Saya BILA Kemas Kini Mempengaruhi Semua Baris, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Kes MySQL Saya BILA Kemas Kini Mempengaruhi Semua Baris, dan Bagaimana Saya Boleh Membetulkannya?

Patricia Arquette
Lepaskan: 2024-12-03 08:12:14
asal
584 orang telah melayarinya

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

Kemas Kini MySQL Menggunakan CASE WHEN/THEN/ELSE: Akibat Tidak Dijangka dan Penyelesaian Ditapis

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
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan