Měli byste to udělat v jediném dotazu:něco ve smyslu UPDATE foo SET sort_index = sort_index + 1 WHERE bar_id == b AND sort_index < s1 AND sort_index >= s2
, kde b
je bar_id
řádku, který se má přesunout, s1
je aktuální sort_index
tohoto řádku a s2
je sort_index
chcete přesunout. Pak byste jen změnili sort_index
z řady.
Pravděpodobně budete chtít provést dva dotazy v rámci transakce. Také by to mohlo urychlit, pokud byste vytvořili index na sort_index
pomocí něčeho jako CREATE INDEX foo_index ON foo (sort_index)
.
(Mimochodem, zde předpokládám, že nechcete duplikovat sort_index
hodnoty v rámci daného bar_id
a že relativní pořadí řádků by se nikdy nemělo měnit jinak než výslovně. Pokud to nepotřebujete, řešení je ještě jednodušší.)