Nej. (ingen, jeg kan komme i tanke om).
Problemet er, hvordan MySQL behandler opdateringer. MySQL (til forskel fra andre DBMS, der implementerer UPDATE
korrekt), behandler opdateringer på en ødelagt måde. Det gennemtvinger kontrol af UNIQUE
(og andre) begrænsninger efter hver enkelt rækkeopdatering og ikke - som det burde gøre - efter hele UPDATE
erklæring afsluttes. Det er derfor, du ikke har dette problem med (de fleste) andre DBMS.
For nogle opdateringer (som at øge alle eller nogle id'er, id=id+1
), kan dette løses ved at bruge - en anden ikke-standard funktion - en ORDER BY
i opdateringen.
For at bytte værdier fra to rækker kan det trick ikke hjælpe. Du skal bruge NULL
eller en falsk værdi (som ikke findes, men som er tilladt i din kolonne) og 2 eller 3 udsagn.
Du kan også midlertidigt fjerne den unikke begrænsning, men jeg synes egentlig ikke, det er en god idé.
Så hvis den unikke kolonne er et signeret heltal, og der ikke er nogen negative værdier, kan du bruge 2 udsagn pakket ind i en transaktion:
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 ;