単一の「スワップ」操作...
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つだけであることが示された場合にロールバックすることで解決できます。