integer
を使用するのはどうですか 順序を定義する列?デフォルトでは、1000、2000、3000などの番号* 1000を割り当て、3000を1000から2000の間で移動すると、1500に変更します。したがって、ほとんどの場合、他の番号を更新する必要はありません。私はこのアプローチを使用し、それはうまく機能します。 double
を使用することもできます ただし、精度と丸め誤差を制御できないため、使用しないでください。
したがって、アルゴリズムは次のようになります :BをAの後の位置に移動するとします。最初にselectを実行して、Aの隣のレコードの順序を確認します。Aの順序より少なくとも+2高い場合は、Bの順序を間に合わせるように設定します。ただし、それが+1だけ高い場合(Aの後にスペースがない場合)、Bの境界レコードを選択して、この側にあるスペースの量を確認し、2で除算してから、この値をA間のすべてのレコードの順序に追加します。とB.それだけです!
(複数のクエリを含むアルゴリズムにはトランザクション/ロックを使用する必要があることに注意してください。これはこの場合にも当てはまります。最も簡単な方法はInnoDBトランザクションを使用することです。)