Ervan uitgaande dat id
is uniek voor elke rij, je kunt dit doen met variabelen:
update <table> t join
(select t.id, @rn := @rn + 1 as seqnum
from <table> t cross join (select @rn := 0) vars
order by old_position
) tt
on tt.id = t.id
set t.position = tt.seqnum;
Als je wilt, kun je dit schrijven zonder de subquery. De uitdaging is het definiëren van de variabele. Hier is een methode:
update <table> t
set t.position = (@rn := coalesce(@rn, 0) + 1)
order by old_position;
U kunt de variabele niet initialiseren in een subquery omdat MySQL beide join
niet toestaat en order by
in een update
verklaring.