Удаление нужного количества записей таблицы в PostgreSQL сводится к двум задачам:
- Написание ПОДЗАПРОСА с лимитом, который возвращает столбец с идентификаторами
- Написание удаления с выражением IN по этим идентификаторам
Выглядит это примерно так:
-- DROP TABLE IF EXISTS test.rrr; CREATE TABLE IF NOT EXISTS test.rrr ( id serial, mfg bigint )
Вставляем выдуманные данные:
INSERT INTO test.rrr (mfg) SELECT unnest(ARRAY[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]);
Смотрим на состав таблицы до удаления
-- Отобрали 100 результатов
SELECT * FROM test.rrr LIMIT 100;
Придумываем условие для отбора идентификаторов с ограниченным количеством результатов:
-- Получаем идентификаторы по условию SELECT id FROM test.rrr WHERE mfg > 7 LIMIT 2;
Удаляем в первый раз
-- Удаляем ограниченное число записей DELETE FROM test.rrr WHERE id IN (SELECT id FROM test.rrr WHERE mfg > 7 LIMIT 2);
Результат удаления:
Удаляем во второй раз
Во второй раз количество записей в таблице также уменьшилось на две штуки.
Уменьшение записей будет продолжаться, пока не закончатся все строки, подходящие под условие.
Зачем удалять записи из таблицы в PostgreSQL по чуть-чуть?
Когда сайт или приложение работает с большими объёмами данных, то иногда возникает задача массового удаления записей из таблиц.
Проблема заключается в том, что если записей очень много, то можно надолго заблокировать таблицу для параллельных изменений и вставок.
Чтобы контролировать блокирование таблиц, нужно дозированно запускать удаления для больших объёмов данных.
Как правило этот контроль ложится на клиента СУБД, которым может быть ваш бэкэнд сервер-приложения.
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Команда DELETE — https://postgrespro.ru/docs/postgresql/14/sql-delete