id
と仮定します は行ごとに一意であるため、変数を使用してこれを行うことができます:
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;
必要に応じて、サブクエリなしでこれを記述できます。課題は変数を定義することです。これが1つの方法です:
update <table> t
set t.position = (@rn := coalesce(@rn, 0) + 1)
order by old_position;
MySQLは両方のjoin
を許可していないため、サブクエリで変数を初期化することはできません。 およびorder by
update
ステートメント。