Трябва да можете да направите това в една заявка:нещо подобно на UPDATE foo SET sort_index = sort_index + 1 WHERE bar_id == b AND sort_index < s1 AND sort_index >= s2
, където b
е bar_id
от реда за преместване, s1
е текущият sort_index
от този ред и s2
е sort_index
искате да го преместите. След това трябва просто да промените sort_index
от реда.
Вероятно бихте искали да направите двете заявки в транзакция. Освен това може да ускорите нещата, ако създадете индекс на sort_index
използвайки нещо като CREATE INDEX foo_index ON foo (sort_index)
.
(Между другото, тук предполагам, че не искате дублиране на sort_index
стойности в рамките на даден bar_id
и че относителният ред на редовете никога не трябва да се променя, освен изрично. Ако нямате нужда от това, решението е още по-просто.)