No. (nessuno a cui mi viene in mente).
Il problema è come MySQL elabora gli aggiornamenti. MySQL (a differenza di altri DBMS che implementano UPDATE
correttamente), elabora gli aggiornamenti in modo non corretto. Impone il controllo di UNIQUE
(e altri) vincoli dopo ogni singolo aggiornamento di riga e non - come dovrebbe fare - dopo l'intero UPDATE
la dichiarazione si completa. Ecco perché non hai questo problema con (la maggior parte) degli altri DBMS.
Per alcuni aggiornamenti (come aumentare tutti o alcuni ID, id=id+1
), questo può essere risolto utilizzando - un'altra funzionalità non standard - un ORDER BY
nell'aggiornamento.
Per scambiare i valori da due righe, quel trucco non può aiutare. Dovrai usare NULL
o un valore fasullo (che non esiste ma è consentito nella tua colonna) e 2 o 3 affermazioni.
Potresti anche rimuovere temporaneamente il vincolo univoco, ma non credo sia davvero una buona idea.
Quindi, se la colonna univoca è un numero intero con segno e non sono presenti valori negativi, puoi utilizzare 2 istruzioni racchiuse in una transazione:
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 ;