Tidak. (tidak ada yang bisa saya pikirkan).
Masalahnya adalah bagaimana MySQL memproses pembaruan. MySQL (berbeda dengan DBMS lain yang mengimplementasikan UPDATE
dengan benar), memproses pembaruan dengan cara yang rusak. Ini memberlakukan pemeriksaan UNIQUE
(dan lainnya) kendala setelah setiap pembaruan baris dan tidak - seperti yang seharusnya dilakukan - setelah UPDATE
keseluruhan pernyataan selesai. Itulah mengapa Anda tidak mengalami masalah ini dengan (sebagian besar) DBMS lainnya.
Untuk beberapa pembaruan (seperti meningkatkan semua atau beberapa id, id=id+1
), ini dapat diselesaikan dengan menggunakan - fitur non-standar lainnya - ORDER BY
dalam pembaruan.
Untuk menukar nilai dari dua baris, trik itu tidak membantu. Anda harus menggunakan NULL
atau nilai palsu (yang tidak ada tetapi diperbolehkan di kolom Anda) dan 2 atau 3 pernyataan.
Anda juga dapat menghapus batasan unik untuk sementara, tetapi menurut saya itu bukan ide yang bagus.
Jadi, jika kolom unik adalah bilangan bulat bertanda dan tidak ada nilai negatif, Anda dapat menggunakan 2 pernyataan yang digabungkan dalam sebuah 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 ;