Пакетное изменение категории у новостей

Обновляйте ограниченную выборку строк, у которых 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 выбирало уже целевую категорию.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее