Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie tausche ich Werte von zwei Zeilen in MySQL aus, ohne die eindeutige Einschränkung zu verletzen?

Nein. (keiner, an den ich denken kann).

Das Problem ist, wie MySQL Updates verarbeitet. MySQL (im Gegensatz zu anderen DBMS, die UPDATE implementieren ordnungsgemäß), verarbeitet Aktualisierungen fehlerhaft. Es erzwingt die Überprüfung von UNIQUE (und andere) Einschränkungen nach jeder einzelnen Zeilenaktualisierung und nicht - wie es sein sollte - nach dem gesamten UPDATE Aussage vervollständigt. Deshalb haben Sie dieses Problem mit (den meisten) anderen DBMS nicht.

Für einige Updates (wie das Erhöhen aller oder einiger IDs, id=id+1 ), kann dies gelöst werden, indem - eine weitere nicht standardmäßige Funktion - ein ORDER BY verwendet wird im Update.

Zum Vertauschen der Werte aus zwei Zeilen kann dieser Trick nicht helfen. Sie müssen NULL verwenden oder ein falscher Wert (der nicht existiert, aber in Ihrer Spalte erlaubt ist) und 2 oder 3 Aussagen.

Sie könnten die Eindeutigkeitsbeschränkung auch vorübergehend entfernen, aber ich denke nicht, dass das wirklich eine gute Idee ist.

Wenn also die Unique-Spalte eine vorzeichenbehaftete Ganzzahl ist und es keine negativen Werte gibt, können Sie 2 Anweisungen verwenden, die in einer Transaktion verpackt sind:

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 ;