Update product set order = order+1 where order >= @value changed
Embora com o tempo você obtenha "espaços" cada vez maiores em seu pedido, mas ainda "classificar"
Isso adicionará 1 ao valor que está sendo alterado e todos os valores após ele em uma instrução, mas a instrução acima ainda é verdadeira. "espaços" cada vez maiores se formarão em sua ordem, possivelmente chegando ao ponto de exceder um valor INT.
Solução alternativa dada o desejo por nenhum espaço:
Imagine um procedimento para:UpdateSortOrder com parâmetros de @NewOrderVal, @IDToChange,@OriginalOrderVal
Processo de duas etapas, dependendo se a ordem nova/antiga está subindo ou descendo a classificação.
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];
Quanto às melhores práticas; a maioria dos ambientes em que estive normalmente deseja algo agrupado por categoria e classificado em ordem alfabética ou com base em "popularidade à venda", negando assim a necessidade de fornecer uma classificação definida pelo usuário.