Update product set order = order+1 where order >= @value changed
Aunque con el tiempo obtendrá "espacios" cada vez más grandes en su pedido, aún se "ordenará"
Esto agregará 1 al valor que se está cambiando y todos los valores posteriores en una declaración, pero la declaración anterior sigue siendo cierta. Se formarán "espacios" cada vez más grandes en su pedido, posiblemente llegando al punto de exceder un valor INT.
Solución alternativa dado el deseo de no tener espacios:
Imagine un procedimiento para:UpdateSortOrder con parámetros de @NewOrderVal, @IDToChange,@OriginalOrderVal
Proceso de dos pasos dependiendo de si el pedido nuevo/antiguo se está moviendo hacia arriba o hacia abajo.
If @NewOrderVal < @OriginalOrderVal --Moving down chain
--Create space for the movement; no point in changing the original
Update product set order = order+1
where order BETWEEN @NewOrderVal and @OriginalOrderVal-1;
end if
If @NewOrderVal > @OriginalOrderVal --Moving up chain
--Create space for the momvement; no point in changing the original
Update product set order = order-1
where order between @OriginalOrderVal+1 and @NewOrderVal
end if
--Finally update the one we moved to correct value
update product set order = @newOrderVal where [email protected];
En cuanto a las mejores prácticas; la mayoría de los entornos en los que he estado generalmente quieren algo agrupado por categoría y ordenado alfabéticamente o según la "popularidad en venta", lo que anula la necesidad de proporcionar una clasificación definida por el usuario.