これは、単一のクエリで実行できるはずです。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
を変更するだけです。 行の。
おそらく、トランザクション内で2つのクエリを実行することをお勧めします。また、sort_index
にインデックスを作成すると、処理が高速化される可能性があります。 CREATE INDEX foo_index ON foo (sort_index)
のようなものを使用する 。
(ちなみに、ここでは重複したsort_index
は必要ないと想定しています。 指定されたbar_id
内の値 、および行の相対的な順序は、明示的に以外は変更しないでください。これが必要ない場合、解決策はさらに簡単です。)