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

Tauschen Sie den Spaltenwert mit derselben Spalte eines anderen Datensatzes aus

Einzelne "Swap"-Operation...

SWAP(@old_pos, @new_pos)

UPDATE
  my_table
SET
  position = CASE WHEN position = @old_pos THEN @new_pos ELSE @old_pos END
WHERE
  position IN (@old_pos, @new_pos)


Dies lässt sich jedoch nicht einfach zu einer Tabelle mit Swap-Operationen erweitern. Dies liegt daran, dass es versucht, alle Swaps auf einmal durchzuführen, obwohl die Swaps tatsächlich in einer bestimmten Reihenfolge stattfinden müssen ...


Wenn Sie außerdem SWAP(@id, @new_pos) durchführen möchten, müssen Sie entweder eine Unterabfrage durchführen oder sich selbst an der Tabelle beteiligen, die Sie aktualisieren. MySQL mag das nicht, und obwohl es Möglichkeiten gibt, die Beschränkung zu umgehen, macht es die Dinge ein bisschen chaotisch ...

UPDATE
  my_table
INNER JOIN
  (SELECT position AS old_pos, @new_pos AS new_pos FROM (SELECT position FROM my_table WHERE id = @id)) AS params
    ON my_table.position IN (params.old_pos, params.new_pos)
SET
  myTable.position = CASE WHEN position = old_pos THEN new_pos ELSE old_pos END

(Ich denke das geht)


HINWEIS:

Beide gehen davon aus, dass SOWOHL @old_pos als auch @new_pos oder @id und @new_pos gefunden werden, es wird nicht geprüft und wird ein Durcheinander machen, wenn sie nicht existieren.

Dies kann gelöst werden, indem Sie es in eine Transaktion einfügen und zurücksetzen, wenn ROW_COUNT() zeigt, dass nur 1 Datensatz aktualisiert wird.