sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo intercambiar valores de dos filas en MySQL sin violar la restricción única?

No. (Ninguno que se me ocurra).

El problema es cómo MySQL procesa las actualizaciones. MySQL (a diferencia de otros DBMS que implementan UPDATE correctamente), procesa las actualizaciones de manera defectuosa. Obliga a verificar UNIQUE (y otras) restricciones después de cada actualización de fila y no, como debería estar haciendo, después de todo UPDATE declaración completa. Es por eso que no tiene este problema con (la mayoría) de los otros DBMS.

Para algunas actualizaciones (como aumentar todos o algunos ID, id=id+1 ), esto se puede resolver usando - otra función no estándar - un ORDER BY en la actualización.

Para intercambiar los valores de dos filas, ese truco no puede ayudar. Tendrás que usar NULL o un valor falso (que no existe pero está permitido en su columna) y 2 o 3 declaraciones.

También podría eliminar temporalmente la restricción única, pero no creo que sea una buena idea.

Entonces, si la columna única es un entero con signo y no hay valores negativos, puede usar 2 declaraciones envueltas en una transacción:

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 ;