¿Qué tal si simplemente usamos un integer
? columna que define el orden? De manera predeterminada, asigna números * 1000, como 1000, 2000, 3000... y si mueve 3000 entre 1000 y 2000, lo cambia a 1500. Por lo tanto, en la mayoría de los casos, no necesita actualizar los otros números. Yo uso este enfoque y funciona bien. También puedes usar double
pero entonces no tienes control sobre la precisión y los errores de redondeo, así que mejor no lo uses.
Así se vería el algoritmo :supongamos que mueve B a la posición después de A. Primero realice la selección para ver el orden del registro al lado de A. Si es al menos +2 más alto que el orden de A, entonces simplemente establece el orden de B para que quepa en el medio. Pero si es solo +1 más alto (no hay espacio después de A), selecciona los registros que bordean B para ver cuánto espacio hay en este lado, divide por 2 y luego agrega este valor al orden de todos los registros entre A y B. ¡Eso es todo!
(Tenga en cuenta que debe usar transacción/bloqueo para cualquier algoritmo que contenga más de una sola consulta, por lo que esto también se aplica a este caso. La forma más fácil es usar la transacción InnoDB).