Не (нито един, за който се сещам).
Проблемът е как MySQL обработва актуализации. MySQL (за разлика от други СУБД, които прилагат UPDATE
правилно), обработва актуализациите по нарушен начин. Той налага проверка на UNIQUE
(и други) ограничения след всяка актуализация на отделен ред, а не - както би трябвало да се прави - след цялата UPDATE
изявлението завършва. Ето защо нямате този проблем с (повечето) други СУБД.
За някои актуализации (като увеличаване на всички или някои идентификатори, id=id+1
), това може да бъде решено с помощта на - друга нестандартна функция - ORDER BY
в актуализацията.
За размяна на стойностите от два реда този трик не може да помогне. Ще трябва да използвате NULL
или фалшива стойност (която не съществува, но е разрешена във вашата колона) и 2 или 3 израза.
Можете също така временно да премахнете уникалното ограничение, но не мисля, че това наистина е добра идея.
Така че, ако уникалната колона е цяло число със знак и няма отрицателни стойности, можете да използвате 2 оператора, обвити в транзакция:
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 ;