Ne. (nic, co mě nenapadá).
Problém je v tom, jak MySQL zpracovává aktualizace. MySQL (na rozdíl od jiných DBMS, které implementují UPDATE
správně), zpracovává aktualizace nefunkčním způsobem. Vynucuje kontrolu UNIQUE
(a další) omezení po každé aktualizaci jednoho řádku a ne - jak by to mělo být - po celé UPDATE
výpis dokončí. To je důvod, proč tento problém s (většinou) ostatních DBMS nemáte.
U některých aktualizací (např. zvýšení všech nebo některých ID, id=id+1
), to lze vyřešit použitím - další nestandardní funkce - ORDER BY
v aktualizaci.
Pro záměnu hodnot ze dvou řádků tento trik nepomůže. Budete muset použít NULL
nebo falešnou hodnotu (která neexistuje, ale je ve vašem sloupci povolena) a 2 nebo 3 příkazy.
Můžete také dočasně odstranit jedinečné omezení, ale nemyslím si, že je to dobrý nápad.
Pokud je tedy jedinečný sloupec celé číslo se znaménkem a neexistují žádné záporné hodnoty, můžete použít 2 příkazy zabalené v transakci:
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 ;