Supondo que
id
é único para cada linha, você pode fazer isso com variáveis: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;
Se você quiser, pode escrever isso sem a subconsulta. O desafio é definir a variável. Aqui está um método:
update <table> t
set t.position = (@rn := coalesce(@rn, 0) + 1)
order by old_position;
Você não pode inicializar a variável em uma subconsulta porque o MySQL não permite tanto
join
e order by
em uma update
declaração.