Ами просто да използвате integer
колона, която определя реда? По подразбиране задавате числа * 1000, като 1000, 2000, 3000.... и ако преместите 3000 между 1000 и 2000, го променяте на 1500. Така че в повечето случаи изобщо не е необходимо да актуализирате останалите числа. Използвам този подход и работи добре. Можете също да използвате double
но тогава нямате контрол върху точността и грешките при закръгляването, така че по-скоро не го използвайте.
Така алгоритъмът ще изглежда :да кажем, че премествате B на позиция след A. Първо направете избор, за да видите реда на записа до A. Ако той е поне +2 по-висок от реда на A, тогава просто задавате реда на B, за да се побере между тях. Но ако е само +1 по-високо (няма интервал след A), избирате граничните записи на B, за да видите колко място има от тази страна, разделяте на 2 и след това добавяте тази стойност към реда на всички записи между A и Б. Това е!
(Обърнете внимание, че трябва да използвате транзакция/заключване за всеки алгоритъм, който съдържа повече от една заявка, така че това важи и за този случай. Най-лесният начин е да използвате транзакция InnoDB.)