Não. (nenhum que eu possa pensar).
O problema é como o MySQL processa as atualizações. MySQL (diferente de outros DBMS que implementam
UPDATE
corretamente), processa as atualizações de maneira quebrada. Ele impõe a verificação de UNIQUE
(e outras) restrições após cada atualização de linha e não - como deveria estar - após todo o UPDATE
declaração completa. É por isso que você não tem esse problema com (a maioria) outros DBMS. Para algumas atualizações (como aumentar todos ou alguns ids,
id=id+1
), isso pode ser resolvido usando - outro recurso não padrão - um ORDER BY
na atualização. Para trocar os valores de duas linhas, esse truque não pode ajudar. Você terá que usar
NULL
ou um valor falso (que não existe, mas é permitido em sua coluna) e 2 ou 3 declarações. Você também pode remover temporariamente a restrição exclusiva, mas não acho que seja uma boa ideia.
Portanto, se a coluna exclusiva for um inteiro com sinal e não houver valores negativos, você poderá usar 2 instruções agrupadas em uma transação:
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 ;