Rumah >pangkalan data >tutorial mysql >Bagaimana Menukar Nilai Baris dalam MySQL dengan Kekangan Unik Tanpa Melanggar Integriti?

Bagaimana Menukar Nilai Baris dalam MySQL dengan Kekangan Unik Tanpa Melanggar Integriti?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 00:23:28250semak imbas

How to Swap Row Values in MySQL with a Unique Constraint Without Violating Integrity?

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!

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