sql >> Databasteknik >  >> RDS >> Sqlserver

Använda en sorteringsordningskolumn i en databastabell

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.



  1. PDO::PARAM för typ decimal?

  2. ORA-01264:Det går inte att skapa loggfilnamn

  3. Hur man använder främmande nyckel i oracle

  4. Datamodifieringar under Läs engagerad ögonblicksbildisolering