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.)