Nej. (ingen som jag kan komma på).
Problemet är hur MySQL bearbetar uppdateringar. MySQL (till skillnad från andra DBMS som implementerar UPDATE
korrekt), bearbetar uppdateringar på ett trasigt sätt. Den framtvingar kontroll av UNIQUE
(och andra) begränsningar efter varje enskild raduppdatering och inte - som det borde göra - efter hela UPDATE
uttalandet slutförs. Det är därför du inte har det här problemet med (de flesta) andra DBMS.
För vissa uppdateringar (som att öka alla eller vissa id, id=id+1
), kan detta lösas genom att använda - en annan icke-standard funktion - en ORDER BY
i uppdateringen.
För att byta värden från två rader kan det tricket inte hjälpa. Du måste använda NULL
eller ett falskt värde (som inte finns men är tillåtet i din kolumn) och 2 eller 3 satser.
Du kan också tillfälligt ta bort den unika begränsningen men jag tror inte att det är en bra idé egentligen.
Så, om den unika kolumnen är ett signerat heltal och det inte finns några negativa värden, kan du använda 2 satser som är samlade 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 ;