Nein. (keiner, an den ich denken kann).
Das Problem ist, wie MySQL Updates verarbeitet. MySQL (im Gegensatz zu anderen DBMS, die UPDATE
implementieren ordnungsgemäß), verarbeitet Aktualisierungen fehlerhaft. Es erzwingt die Überprüfung von UNIQUE
(und andere) Einschränkungen nach jeder einzelnen Zeilenaktualisierung und nicht - wie es sein sollte - nach dem gesamten UPDATE
Aussage vervollständigt. Deshalb haben Sie dieses Problem mit (den meisten) anderen DBMS nicht.
Für einige Updates (wie das Erhöhen aller oder einiger IDs, id=id+1
), kann dies gelöst werden, indem - eine weitere nicht standardmäßige Funktion - ein ORDER BY
verwendet wird im Update.
Zum Vertauschen der Werte aus zwei Zeilen kann dieser Trick nicht helfen. Sie müssen NULL
verwenden oder ein falscher Wert (der nicht existiert, aber in Ihrer Spalte erlaubt ist) und 2 oder 3 Aussagen.
Sie könnten die Eindeutigkeitsbeschränkung auch vorübergehend entfernen, aber ich denke nicht, dass das wirklich eine gute Idee ist.
Wenn also die Unique-Spalte eine vorzeichenbehaftete Ganzzahl ist und es keine negativen Werte gibt, können Sie 2 Anweisungen verwenden, die in einer Transaktion verpackt sind:
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 ;