Hvad med bare at bruge et integer
kolonne, der definerer rækkefølgen? Som standard tildeler du numre * 1000, som 1000, 2000, 3000.... og flytter du 3000 mellem 1000 og 2000 ændrer du det til 1500. Så i de fleste tilfælde behøver du slet ikke at opdatere de andre tal. Jeg bruger denne tilgang, og den fungerer godt. Du kan også bruge double
men så har du ikke styr på præcisions- og afrundingsfejlene, så lad være med at bruge det.
Algoritmen ville altså se ud :sig, at du flytter B til position efter A. Udfør først vælg for at se rækkefølgen af posten ved siden af A. Hvis den er mindst +2 højere end rækkefølgen af A, så sætter du bare rækkefølgen af B til at passe ind imellem. Men hvis det bare er +1 højere (der er intet mellemrum efter A), vælger du grænseposterne for B for at se, hvor meget plads der er på denne side, dividerer med 2 og tilføjer derefter denne værdi til rækkefølgen af alle posterne mellem A og B. Det er det!
(Bemærk, at du bør bruge transaktion/låsning til enhver algoritme, der indeholder mere end en enkelt forespørgsel, så dette gælder også for dette tilfælde. Den nemmeste måde er at bruge InnoDB-transaktion.)