AS (
SELECT cte.student_id
FROM students cte
WHERE student_id > 41
ORDER BY cte.student_id ASC
LIMIT 10
)
UPDATE students st
SET modify_time = create_time + interval '1 second'
FROM cte
WHERE cte.student_id = st.student_id
AND st.modify_time < st.create_time;
ROLLBACK;
END;
$$
-- students.student_id - primary key,
-- по полям modify_time и create_time подходящих индексов нет.
Вопрос: как проще всего с минимальным чтением узнать последний id из cte?
В дальнейшем я хочу сделать переменную, чтобы в цикле update'ить записи. И чтобы каждый update был в одной транзакции, так как не хочется надолго блочиить таблицу. Возможно даже некоторую паузу поставить между итерациями.
>опрос: как проще всего с минимальным чтением узнать последний id из cte? SELECT max(id) FROM cte >В дальнейшем я хочу сделать переменную, чтобы в цикле update'ить записи. Выглядит как отрезание хвоста по частям. Не, вообще подход с делением большых update на какие-то маленькие -- имеет право на жызнь. Но с переменными и по одной -- это ещё хужэ, чем какой-нибудь миллиард записей сразу переписать.
Не по одной) Я планировал найти оптимальное значение для limit в cte. Может быть будет 10 итераций, а может быть 100.
Главное -- не забудьте, что в РСУБД любая транзакцыя имеет право навернуться.
> Выглядит как отрезание хвоста по частям. Вот да, пример неудачный, не бывает так много студентов, что бы базу колом поставить.
магическое число 500, как и в оракле, не знаю с чем связано )
жуть конечно. а в чем смысл кода?
Обсуждают сегодня