Mysql
 sql >> Base de données >  >> RDS >> Mysql

Permuter la valeur de la colonne avec la même colonne d'un autre enregistrement

Opération "swap" unique...

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)


Cependant, cela ne s'étend pas facilement à une table d'opérations d'échange. C'est parce qu'il essaiera de faire tous les swaps en même temps, alors qu'en fait les swaps doivent se produire dans un ordre spécifique...


De plus, si vous voulez faire SWAP(@id, @new_pos), vous devez soit faire une sous-requête, soit une jointure automatique sur la table que vous mettez à jour. MySQL n'aime pas ça, et bien qu'il existe des moyens de contourner la limitation, cela rend les choses un peu compliquées...

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

(Je pense ça marchera)


REMARQUE :

Ces deux éléments supposent que les DEUX @old_pos et @new_pos, ou @id et @new_pos sont trouvés, il ne vérifie pas, et le fera faire un gâchis s'ils n'existent pas.

Cela peut être résolu en le plaçant dans une transaction et en annulant si ROW_COUNT() indique qu'un seul enregistrement est mis à jour.