Qu'en est-il simplement d'utiliser un integer
colonne qui définit l'ordre ? Par défaut, vous attribuez des nombres * 1000, comme 1000, 2000, 3000... et si vous déplacez 3000 entre 1000 et 2000, vous le changez en 1500. Ainsi, dans la plupart des cas, vous n'avez pas du tout besoin de mettre à jour les autres nombres. J'utilise cette approche et cela fonctionne bien. Vous pouvez également utiliser double
mais alors vous n'avez pas de contrôle sur la précision et les erreurs d'arrondi, alors ne l'utilisez pas.
Ainsi, l'algorithme ressemblerait à :disons que vous déplacez B vers la position après A. Effectuez d'abord une sélection pour voir l'ordre de l'enregistrement à côté de A. S'il est supérieur d'au moins +2 à l'ordre de A, vous définissez simplement l'ordre de B pour qu'il se situe entre les deux. Mais si c'est juste +1 plus haut (il n'y a pas d'espace après A), vous sélectionnez les enregistrements limitrophes de B pour voir combien d'espace il y a de ce côté, divisez par 2 puis ajoutez cette valeur à l'ordre de tous les enregistrements entre A et B. C'est tout !
(Notez que vous devez utiliser transaction/verrouillage pour tout algorithme qui contient plus d'une seule requête, donc cela s'applique également à ce cas. Le moyen le plus simple est d'utiliser la transaction InnoDB.)