Powinieneś być w stanie zrobić to w jednym zapytaniu:coś w stylu UPDATE foo SET sort_index = sort_index + 1 WHERE bar_id == b AND sort_index < s1 AND sort_index >= s2
, gdzie b
to bar_id
wiersza do przeniesienia, s1
jest bieżącym sort_index
tego wiersza i s2
to sort_index
chcesz go przenieść. Następnie wystarczy zmienić sort_index
z rzędu.
Prawdopodobnie chciałbyś wykonać dwa zapytania w ramach transakcji. Ponadto może to przyspieszyć, jeśli utworzysz indeks w sort_index
używając czegoś takiego jak CREATE INDEX foo_index ON foo (sort_index)
.
(Przy okazji, zakładam, że nie chcesz duplikować sort_index
wartości w ramach danego bar_id
i że względna kolejność wierszy nigdy nie powinna być zmieniana, chyba że jawnie. Jeśli tego nie potrzebujesz, rozwiązanie jest jeszcze prostsze.)