Menukar Nilai Baris dengan Kekangan Unik dalam MySQL
Soalan:
Bagaimana anda boleh menukar nilai keutamaan dua baris dalam MySQL tanpa melanggar kekangan unik jadual pada lajur keutamaan?
Latar Belakang:
Jadual tugas mempunyai lajur keutamaan dengan unik kekangan, bermakna setiap baris boleh mempunyai nilai unik dalam lajur itu. Apabila mengemas kini baris, MySQL menyemak pelanggaran kekangan unik selepas setiap kemas kini, yang menghalang pertukaran nilai secara langsung.
Penyelesaian:
Malangnya, tidak mungkin untuk menukar nilai baris terus dalam MySQL tanpa melanggar kekangan unik atau menggunakan nilai palsu dan berbilang pertanyaan. Ini disebabkan oleh cara MySQL yang luar biasa dalam memproses kemas kini, yang menguatkuasakan semakan keunikan selepas setiap kemas kini baris dan bukannya selepas penyataan kemas kini selesai.
Walaupun mungkin untuk menyelesaikan isu serupa dengan DBMS lain menggunakan helah seperti ORDER BY , teknik ini tidak berfungsi untuk menukar nilai.
Alternatif:
Dua pendekatan alternatif boleh dipertimbangkan:
Contoh (Integer Bertanda dan Tiada Nilai Negatif):
Jika lajur keutamaan ialah integer bertandatangan yang tidak mengandungi nilai negatif, anda boleh menggunakan pertanyaan berikut yang dibungkus dalam transaksi:
<code class="sql">START TRANSACTION ; UPDATE tasks SET priority = CASE WHEN priority = 2 THEN -3 WHEN priority = 3 THEN -2 END WHERE priority IN (2,3) ; UPDATE tasks SET priority = - priority WHERE priority IN (-2,-3) ; COMMIT ;</code>
Atas ialah kandungan terperinci Bagaimana Menukar Nilai Keutamaan Baris dalam MySQL dengan Kekangan Unik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!