Если это разовая акция, то просто UPDATE решает задачу, но если это будет требоваться делать периодитчески, то можно создать отдельную таблицу c полями position и newposition и сохранить в нее для каждого значения position из исходной таблицы новое значение newposition.
А далее в запросах джойнить две таблицы.
Если в созданной таблице сделать первичный ключ по position, то джойн будет очень быстрым.
Плюсы такого решения:
Таблица product не блокируется (UPDATE накладывает блокировки, кроме этого каждый апдейтв - это запись в журнале транзакций, что тоже не бесплатно)
Не происходит перестроения индексов в которые входит поле position (если таблица product большая - это существенно может сказаться на производительности)
Не происходит деградации статистики по полю position, если по этому полю плохая статистика оптимизатор не сможет построить хороший запрос.
Если в других таблицах есть ссылка на поле position, эти таблицы не придется также апдейтить.
В случае сбоя скрипта наполняющего новую таблицу вы ничего не теряете (очистили полностью и наполнили заново), в случае апдейта исходной таблицы могут быть варианты.
Из минусов:
Нужно поддерживать еще одну таблицу.
Нужно переписать запросы - добавить джой.