Update product set order = order+1 where order >= @value changed
Även om du med tiden kommer att få större och större "utrymmen" i din beställning men den kommer fortfarande att "sorteras"
Detta kommer att lägga till 1 till värdet som ändras och varje värde efter det i ett påstående, men ovanstående påstående är fortfarande sant. större och större "mellanslag" kommer att bildas i din beställning som eventuellt kommer till en punkt att överskrida ett INT-värde.
Alternativ lösning givet önskemål om inga mellanslag:
Föreställ dig en procedur för:UpdateSortOrder med parametrarna @NewOrderVal, @IDToChange,@OriginalOrderVal
Tvåstegsprocess beroende på om ny/gammal ordning rör sig uppåt eller nedåt.
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];
När det gäller bästa praxis; de flesta miljöer jag har varit i vill vanligtvis ha något grupperat efter kategori och sorterat i alfabetisk ordning eller baserat på "popularitet vid rea", vilket förnekar behovet av att tillhandahålla en användardefinierad sortering.