Sie sollten dies in einer einzigen Abfrage tun können:etwas in der Art von UPDATE foo SET sort_index = sort_index + 1 WHERE bar_id == b AND sort_index < s1 AND sort_index >= s2
, wobei b
ist die bar_id
der zu verschiebenden Zeile, s1
ist der aktuelle sort_index
dieser Zeile und s2
ist der sort_index
Sie möchten es verschieben. Dann würden Sie einfach den sort_index
ändern der Reihe.
Wahrscheinlich möchten Sie die beiden Abfragen innerhalb einer Transaktion durchführen. Außerdem kann es die Dinge beschleunigen, wenn Sie einen Index auf dem sort_index
erstellen Verwenden Sie so etwas wie CREATE INDEX foo_index ON foo (sort_index)
.
(Übrigens gehe ich hier davon aus, dass Sie keinen doppelten sort_index
wollen Werte innerhalb einer bestimmten bar_id
, und dass die relative Reihenfolge der Zeilen nur explizit geändert werden sollte. Wenn Sie dies nicht benötigen, ist die Lösung sogar noch einfacher.)