Vous devriez pouvoir le faire en une seule requête :quelque chose comme UPDATE foo SET sort_index = sort_index + 1 WHERE bar_id == b AND sort_index < s1 AND sort_index >= s2
, où b
est le bar_id
de la ligne à déplacer, s1
est le sort_index
actuel de cette ligne, et s2
est le sort_index
vous voulez le déplacer. Ensuite, il vous suffirait de modifier le sort_index
de la ligne.
Vous voudriez probablement faire les deux requêtes à l'intérieur d'une transaction. De plus, cela pourrait accélérer les choses si vous créiez un index sur le sort_index
en utilisant quelque chose comme CREATE INDEX foo_index ON foo (sort_index)
.
(Au fait, je suppose ici que vous ne voulez pas dupliquer sort_index
valeurs dans un bar_id
donné , et que l'ordre relatif des lignes ne doit jamais être modifié, sauf explicitement. Si vous n'en avez pas besoin, la solution est encore plus simple.)