Operasi "tukar" tunggal...
SWAP(@old_pos, @new_pos)
UPDATE
my_table
SET
position = CASE WHEN position = @old_pos THEN @new_pos ELSE @old_pos END
WHERE
position IN (@old_pos, @new_pos)
Ini tidak mudah diperluas ke tabel operasi swap. Ini karena ia akan mencoba melakukan semua swap sekaligus, padahal sebenarnya swap harus terjadi dalam urutan tertentu...
Juga, jika Anda ingin melakukan SWAP(@id, @new_pos) Anda perlu melakukan sub-query atau bergabung sendiri pada tabel yang Anda perbarui. MySQL tidak menyukainya, dan meskipun ada beberapa cara untuk mengatasi keterbatasan, hal itu membuat segalanya menjadi sedikit berantakan...
UPDATE
my_table
INNER JOIN
(SELECT position AS old_pos, @new_pos AS new_pos FROM (SELECT position FROM my_table WHERE id = @id)) AS params
ON my_table.position IN (params.old_pos, params.new_pos)
SET
myTable.position = CASE WHEN position = old_pos THEN new_pos ELSE old_pos END
(Saya berpikir itu akan berhasil)
CATATAN:
Keduanya berasumsi bahwa KEDUA @old_pos dan @new_pos, atau @id dan @new_pos ditemukan, tidak diperiksa, dan akan membuat berantakan jika mereka tidak ada.
Ini dapat diselesaikan dengan memasukkannya ke dalam transaksi, dan memutar kembali jika ROW_COUNT() menunjukkan bahwa hanya 1 catatan yang diperbarui.