No. (Ninguno que se me ocurra).
El problema es cómo MySQL procesa las actualizaciones. MySQL (a diferencia de otros DBMS que implementan UPDATE
correctamente), procesa las actualizaciones de manera defectuosa. Obliga a verificar UNIQUE
(y otras) restricciones después de cada actualización de fila y no, como debería estar haciendo, después de todo UPDATE
declaración completa. Es por eso que no tiene este problema con (la mayoría) de los otros DBMS.
Para algunas actualizaciones (como aumentar todos o algunos ID, id=id+1
), esto se puede resolver usando - otra función no estándar - un ORDER BY
en la actualización.
Para intercambiar los valores de dos filas, ese truco no puede ayudar. Tendrás que usar NULL
o un valor falso (que no existe pero está permitido en su columna) y 2 o 3 declaraciones.
También podría eliminar temporalmente la restricción única, pero no creo que sea una buena idea.
Entonces, si la columna única es un entero con signo y no hay valores negativos, puede usar 2 declaraciones envueltas en una transacción:
START TRANSACTION ;
UPDATE tasks
SET priority =
CASE
WHEN priority = 2 THEN -3
WHEN priority = 3 THEN -2
END
WHERE priority IN (2,3) ;
UPDATE tasks
SET priority = - priority
WHERE priority IN (-2,-3) ;
COMMIT ;