Rumah >pangkalan data >tutorial mysql >Bagaimana Menukar Nilai Baris dalam MySQL dengan Kekangan Unik Tanpa Melanggar Integriti?
Menukar Nilai Baris dalam MySQL Sambil Mengekalkan Kekangan Unik
Dalam MySQL, tugas menukar nilai keutamaan antara dua baris dalam jadual dengan kekangan unik boleh menghadapi ralat disebabkan pelanggaran kekangan. Untuk memahami isu ini, mari kita periksa kenyataan KEMASKINI yang biasa:
UPDATE tasks SET priority = CASE WHEN priority=2 THEN 3 WHEN priority=3 THEN 2 END WHERE priority IN (2,3);
Pernyataan ini, walau bagaimanapun, mengakibatkan ralat:
Error Code: 1062. Duplicate entry '3' for key 'priority_UNIQUE'
Sifat Isu
MySQL memproses kemas kini secara berbeza daripada DBMS lain. Ia menyemak pelanggaran kekangan selepas setiap kemas kini baris, bukannya selepas keseluruhan pernyataan selesai. Akibatnya, pertukaran nilai secara langsung melanggar kekangan unik.
Alternatif tanpa Nilai Bogus atau Berbilang Pertanyaan
Malangnya, tiada cara untuk melaksanakan operasi ini tanpa menggunakan nilai perantaraan (palsu atau null) atau berbilang pertanyaan dalam MySQL. Kekangan unik menguatkuasakan keunikan selepas setiap kemas kini baris, menjadikan pertukaran langsung mustahil.
Penyingkiran Kekangan Sementara
Satu pilihan ialah mengalih keluar kekangan unik buat sementara waktu, laksanakan operasi swap , dan kemudian tambah semula kekangan. Walau bagaimanapun, pendekatan ini tidak disyorkan kerana ia menjejaskan integriti data.
Nilai Bogus dan Berbilang Pertanyaan
Pendekatan yang disyorkan melibatkan penggunaan nilai palsu (-3) untuk sementara waktu tahan nilai keutamaan baris pertama dan tukar dengan nilai baris kedua. Dua pertanyaan dalam transaksi diperlukan:
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 ;
Proses ini memastikan kekangan tidak dilanggar semasa operasi swap.
Atas ialah kandungan terperinci Bagaimana Menukar Nilai Baris dalam MySQL dengan Kekangan Unik Tanpa Melanggar Integriti?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!