Enkelt "bytte"-operation...
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)
Dette udvides dog ikke nemt til en tabel med swap-operationer. Dette er fordi det vil forsøge at udføre alle bytte på én gang, mens byttet faktisk skal ske i en bestemt rækkefølge...
Hvis du vil lave SWAP(@id, @new_pos), skal du enten lave en underforespørgsel eller selv deltage på bordet, du opdaterer. Det kan MySQL ikke lide, og selvom der er måder at omgå begrænsningen, gør det tingene lidt rodet...
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
(Jeg tror det vil virke)
BEMÆRK:
Begge disse antager, at BÅDE @old_pos og @new_pos, eller @id og @new_pos findes, det tjekker ikke, og vil lave noget rod, hvis de ikke findes.
Dette kan løses ved at indsætte det i en transaktion og rulle tilbage, hvis ROW_COUNT() viser, at kun 1 post er opdateret.