Bagaimana Menukar Nilai Baris dalam MySQL Sambil Menghormati Kekangan Unik?

Linda Hamilton
Lepaskan: 2024-10-26 14:42:02
asal
621 orang telah melayarinya

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

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!