Rumah  >  Artikel  >  pangkalan data  >  Bagaimana Menukar Nilai Baris dalam MySQL Sambil Menghormati Kekangan Unik?

Bagaimana Menukar Nilai Baris dalam MySQL Sambil Menghormati Kekangan Unik?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 14:42:02622semak imbas

How to Swap Row Values in MySQL While Respecting Unique Constraints?

Menukar Nilai Baris dalam MySQL Tanpa Melanggar Kekangan Unik

Dalam MySQL, selalunya perlu menukar nilai dua baris dalam jadual sambil mengekalkan kekangan unik pada lajur tertentu. Walau bagaimanapun, menggunakan kenyataan UPDATE biasa dengan klausa CASE boleh mengakibatkan ralat masukan pendua jika kekangan unik dilanggar.

Isunya

Masalah timbul kerana MySQL memproses kemas kini baris demi baris, menyemak pelanggaran kekangan unik selepas setiap perubahan. Dalam contoh yang disediakan:

UPDATE tasks
SET priority = 
CASE
    WHEN priority=2 THEN 3 
    WHEN priority=3 THEN 2 
END 

WHERE priority IN (2,3);

MySQL mengemas kini baris pertama dengan keutamaan 2 kepada keutamaan 3. Walau bagaimanapun, apabila ia cuba mengemas kini baris kedua dengan keutamaan 3 kepada keutamaan 2, ia menghadapi pelanggaran kerana 3 sudah wujud sebagai nilai unik.

Penyelesaian

Malangnya, adalah tidak mungkin untuk mencapai pertukaran nilai baris dalam MySQL tanpa menggunakan nilai palsu atau berbilang pertanyaan. Ini disebabkan oleh tingkah laku pemprosesan kekangan MySQL yang unik.

Untuk menyelesaikan pengehadan ini, seseorang boleh menggunakan pendekatan dua pernyataan berikut yang dibungkus dalam transaksi:

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 ;

Pendekatan ini menukar nilai secara berkesan dengan memberikan nilai negatif sebagai pemegang tempat sementara. Dalam urus niaga, MySQL menganggap kemas kini sebagai satu operasi, menghalang pelanggaran kekangan unik.

Atas ialah kandungan terperinci Bagaimana Menukar Nilai Baris dalam MySQL Sambil Menghormati Kekangan Unik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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