Você deve ser capaz de fazer isso em uma única consulta:algo como
UPDATE foo SET sort_index = sort_index + 1 WHERE bar_id == b AND sort_index < s1 AND sort_index >= s2
, onde b
é o bar_id
da linha a ser movida, s1
é o sort_index
atual dessa linha e s2
é o sort_index
você deseja movê-lo. Em seguida, basta alterar o sort_index
da fila. Você provavelmente gostaria de fazer as duas consultas dentro de uma transação. Além disso, pode acelerar as coisas se você criar um índice no
sort_index
usando algo como CREATE INDEX foo_index ON foo (sort_index)
. (A propósito, aqui estou assumindo que você não quer duplicar
sort_index
valores dentro de um determinado bar_id
, e que a ordem relativa das linhas nunca deve ser alterada, exceto explicitamente. Se você não precisa disso, a solução é ainda mais simples.)