Heim  >  Artikel  >  Datenbank  >  Wie tausche ich Zeilenwerte in MySQL unter Berücksichtigung eindeutiger Einschränkungen aus?

Wie tausche ich Zeilenwerte in MySQL unter Berücksichtigung eindeutiger Einschränkungen aus?

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 14:42:02622Durchsuche

How to Swap Row Values in MySQL While Respecting Unique Constraints?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn