Обновляйте ограниченную выборку строк, у которых category_id ещё не равен 1. OFFSET здесь не нужен: после изменения набор кандидатов сокращается, и смещение может пропускать записи.
Пакетное изменение категории у новостей
Обновляйте ограниченную выборку строк, у которых category_id ещё не равен 1. OFFSET здесь не нужен: после изменения набор кандидатов сокращается, и смещение может пропускать записи.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо составить SQL‑запрос, который:
- выбирает все строки из таблицы news;
- задаёт поле category_id значение 1 для каждой найденной записи;
- реализует постраничную обработку, например, обновляя по 10 записей за один запуск.
Select * from news where category_id = 1 limit 10 offset;
id title category_id user_id
Ответ
Обновляйте ограниченную выборку строк, у которых category_id ещё не равен 1. OFFSET здесь не нужен: после изменения набор кандидатов сокращается, и смещение может пропускать записи.
В PostgreSQL один пакет из десяти:
WITH batch AS (
SELECT id
FROM news
WHERE category_id IS DISTINCT FROM 1
ORDER BY id
LIMIT 10
FOR UPDATE SKIP LOCKED
)
UPDATE news AS n
SET category_id = 1
FROM batch AS b
WHERE n.id = b.id
RETURNING n.id;
IS DISTINCT FROM включает NULL. Повторяйте отдельными короткими транзакциями; для параллельных обработчиков SKIP LOCKED пропускает занятые строки, поэтому временно пустой пакет ещё не доказывает глобальное завершение. Условие category_id=1 из исходного SELECT выбирало уже целевую категорию.