Opération "swap" unique...
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)
Cependant, cela ne s'étend pas facilement à une table d'opérations d'échange. C'est parce qu'il essaiera de faire tous les swaps en même temps, alors qu'en fait les swaps doivent se produire dans un ordre spécifique...
De plus, si vous voulez faire SWAP(@id, @new_pos), vous devez soit faire une sous-requête, soit une jointure automatique sur la table que vous mettez à jour. MySQL n'aime pas ça, et bien qu'il existe des moyens de contourner la limitation, cela rend les choses un peu compliquées...
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
(Je pense ça marchera)
REMARQUE :
Ces deux éléments supposent que les DEUX @old_pos et @new_pos, ou @id et @new_pos sont trouvés, il ne vérifie pas, et le fera faire un gâchis s'ils n'existent pas.
Cela peut être résolu en le plaçant dans une transaction et en annulant si ROW_COUNT() indique qu'un seul enregistrement est mis à jour.