Heim  >  Artikel  >  Datenbank  >  Wie tausche ich Zeilenprioritätswerte in MySQL mit einer eindeutigen Einschränkung aus?

Wie tausche ich Zeilenprioritätswerte in MySQL mit einer eindeutigen Einschränkung aus?

Susan Sarandon
Susan SarandonOriginal
2024-10-26 16:40:02769Durchsuche

How to Swap Row Priority Values in MySQL with a Unique Constraint?

Werte von Zeilen mit eindeutigen Einschränkungen in MySQL austauschen

Frage:

Wie können Sie die Prioritätswerte zweier Zeilen in MySQL vertauschen, ohne die Eindeutigkeitsbeschränkung der Tabelle für die Prioritätsspalte zu verletzen?

Hintergrund:

Die Aufgabentabelle hat eine Prioritätsspalte mit einer Eindeutigkeit Einschränkung, was bedeutet, dass jede Zeile in dieser Spalte einen eindeutigen Wert haben kann. Bei der Aktualisierung von Zeilen prüft MySQL nach jeder Aktualisierung, ob eindeutige Einschränkungsverletzungen vorliegen, was den direkten Austausch von Werten verhindert.

Lösung:

Leider ist es nicht möglich, Werte von auszutauschen Zeilen direkt in MySQL, ohne die Eindeutigkeitsbeschränkung zu verletzen oder falsche Werte und mehrere Abfragen zu verwenden. Dies liegt an der ungewöhnlichen Art und Weise von MySQL, Aktualisierungen zu verarbeiten, die Eindeutigkeitsprüfungen nach jeder Zeilenaktualisierung erzwingt, anstatt nach Abschluss der Aktualisierungsanweisung.

Während es möglich sein kann, ähnliche Probleme mit anderen DBMS mithilfe von Tricks wie ORDER BY zu lösen , diese Technik funktioniert nicht zum Austauschen von Werten.

Alternativen:

Zwei alternative Ansätze können in Betracht gezogen werden:

  1. NULL oder falsche Werte: Verwenden Sie einen NULL-Wert oder einen falschen Wert, der in der Spalte nicht vorhanden ist. Dies erfordert die Verwendung mehrerer Abfragen, um den Austausch abzuschließen.
  2. Vorübergehende Einschränkungsentfernung: Entfernen Sie die eindeutige Einschränkung vorübergehend, führen Sie den Austausch durch und fügen Sie die Einschränkung erneut hinzu. Dies ist kein empfohlener Ansatz, da er zu Problemen mit der Datenintegrität führen kann.

Beispiel (Vorzeichenbehaftete Ganzzahl und keine negativen Werte):

Wenn die Prioritätsspalte eine Ganzzahl mit Vorzeichen ist, die keine negativen Werte enthält, können Sie die folgende Abfrage verwenden, die in eine Transaktion eingebunden ist:

<code class="sql">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 ;</code>

Das obige ist der detaillierte Inhalt vonWie tausche ich Zeilenprioritätswerte in MySQL mit einer eindeutigen Einschränkung 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