Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como trocar valores de duas linhas no MySQL sem violar a restrição exclusiva?


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 ;