Zeilenwerte in MySQL austauschen, ohne eindeutige Einschränkungen zu verletzen
In MySQL ist es oft notwendig, die Werte zweier Zeilen in einer Tabelle auszutauschen unter Beibehaltung einer eindeutigen Einschränkung für eine bestimmte Spalte. Allerdings kann die Verwendung der typischen UPDATE-Anweisung mit einer CASE-Klausel zu einem Fehler bei der doppelten Eingabe führen, wenn die Eindeutigkeitsbeschränkung verletzt wird.
Das Problem
Das Problem entsteht durch MySQL Verarbeitet Aktualisierungen Zeile für Zeile und prüft nach jeder Änderung auf Verstöße gegen eindeutige Einschränkungen. Im bereitgestellten Beispiel:
UPDATE tasks SET priority = CASE WHEN priority=2 THEN 3 WHEN priority=3 THEN 2 END WHERE priority IN (2,3);
MySQL aktualisiert die erste Zeile mit Priorität 2 auf Priorität 3. Wenn es jedoch versucht, die zweite Zeile mit Priorität 3 auf Priorität 2 zu aktualisieren, stößt es auf einen Verstoß, da bereits 3 vorliegt existiert als eindeutiger Wert.
Die Lösung
Leider ist es nicht möglich, den Austausch von Zeilenwerten in MySQL durchzuführen, ohne falsche Werte oder mehrere Abfragen zu verwenden. Dies ist auf das einzigartige Verarbeitungsverhalten von MySQL zurückzuführen.
Um diese Einschränkung zu umgehen, kann man den folgenden Zwei-Anweisungs-Ansatz verwenden, der in eine Transaktion eingebunden ist:
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 ;
Dieser Ansatz tauscht effektiv die Werte aus durch Zuweisung negativer Werte als temporärer Platzhalter. Innerhalb der Transaktion betrachtet MySQL Aktualisierungen als einen einzelnen Vorgang und verhindert so die Verletzung der eindeutigen Einschränkung.
Das obige ist der detaillierte Inhalt vonWie tausche ich Zeilenwerte in MySQL unter Berücksichtigung eindeutiger Einschränkungen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!