Nie. (żadne, o czym bym nie pomyślał).
Problem polega na tym, jak MySQL przetwarza aktualizacje. MySQL (w przeciwieństwie do innych DBMS, które implementują UPDATE
prawidłowo) przetwarza aktualizacje w zepsuty sposób. Wymusza sprawdzenie UNIQUE
(i inne) ograniczenia po każdej aktualizacji wiersza, a nie - jak powinno być - po całej UPDATE
oświadczenie się kończy. Dlatego nie masz tego problemu z (większością) innych DBMS.
W przypadku niektórych aktualizacji (takich jak zwiększenie wszystkich lub niektórych identyfikatorów, id=id+1
), można to rozwiązać za pomocą - innej niestandardowej funkcji - ORDER BY
w aktualizacji.
W przypadku zamiany wartości z dwóch wierszy ta sztuczka nie może pomóc. Będziesz musiał użyć NULL
lub fałszywa wartość (która nie istnieje, ale jest dozwolona w Twojej kolumnie) i 2 lub 3 stwierdzenia.
Możesz także tymczasowo usunąć to ograniczenie, ale nie sądzę, żeby to był dobry pomysł.
Tak więc, jeśli unikalna kolumna jest liczbą całkowitą ze znakiem i nie ma wartości ujemnych, możesz użyć 2 instrukcji zawartych w transakcji:
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 ;