Единична операция "swap"...
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)
Това обаче не може лесно да се разшири до таблица на суаповите операции. Това е така, защото ще се опита да извърши всички суапове наведнъж, докато всъщност суаповете трябва да се извършват в определен ред...
Освен това, ако искате да направите SWAP(@id, @new_pos), трябва или да направите подзаявка, или да се присъедините самостоятелно към таблицата, която актуализирате. MySQL не харесва това и въпреки че има начини да се заобиколи ограничението, това прави нещата малко объркващи...
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
(Аз мисля това ще работи)
ЗАБЕЛЕЖКА:
И двете предполагат, че И ДВАТА @old_pos и @new_pos, или @id и @new_pos са намерени, то не проверява и ще направи бъркотия, ако не съществуват.
Това може да се реши, като се постави в транзакция и се върне назад, ако ROW_COUNT() показва, че само 1 запис е актуализиран.