Dovresti essere in grado di farlo in una singola query:qualcosa sulla falsariga di UPDATE foo SET sort_index = sort_index + 1 WHERE bar_id == b AND sort_index < s1 AND sort_index >= s2
, dove b
è il bar_id
della riga da spostare, s1
è l'attuale sort_index
di quella riga e s2
è il sort_index
in cui vuoi spostarlo. Quindi, dovresti semplicemente cambiare il sort_index
della riga.
Probabilmente vorresti eseguire le due query all'interno di una transazione. Inoltre, potrebbe velocizzare le cose se hai creato un indice su sort_index
usando qualcosa come CREATE INDEX foo_index ON foo (sort_index)
.
(A proposito, qui suppongo che tu non voglia duplicare sort_index
valori all'interno di un dato bar_id
e che l'ordine relativo delle righe non dovrebbe mai essere modificato se non in modo esplicito. Se non ti serve, la soluzione è ancora più semplice.)