Angenommen, diese id
für jede Zeile eindeutig ist, können Sie dies mit Variablen tun:
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;
Wenn Sie möchten, können Sie dies auch ohne die Unterabfrage schreiben. Die Herausforderung besteht darin, die Variable zu definieren. Hier ist eine Methode:
update <table> t
set t.position = (@rn := coalesce(@rn, 0) + 1)
order by old_position;
Sie können die Variable nicht in einer Unterabfrage initialisieren, da MySQL nicht beide join
zulässt und order by
in einem update
Aussage.