PostgreSQL | Как удалить ограниченное количество записей командой DELETE?

PostgreSQL | Как удалить ограниченное количество записей командой DELETE?

Удаление нужного количества записей таблицы в PostgreSQL сводится к двум задачам:

  1. Написание ПОДЗАПРОСА с лимитом, который возвращает столбец с идентификаторами
  2. Написание удаления с выражением 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;
Таблица с 11 записями в PostgreSQL
Таблица с 11 записями в PostgreSQL

Придумываем условие для отбора идентификаторов с ограниченным количеством результатов:

-- Получаем идентификаторы по условию
SELECT id FROM test.rrr WHERE mfg > 7 LIMIT 2;
Получили два ограниченных результата с ID по условию в PostgreSQL
Получили два ограниченных результата с ID по условию в PostgreSQL

 

Удаляем в первый раз

-- Удаляем ограниченное число записей
DELETE FROM test.rrr WHERE id IN (SELECT id FROM test.rrr WHERE mfg > 7 LIMIT 2);

Результат удаления:

Первое удаление ограниченного количества данных из таблицы в PostgreSQL
Первое удаление ограниченного количества данных из таблицы в PostgreSQL

 

Удаляем во второй раз

Второе удаление ограниченного количества данных из таблицы в PostgreSQL
Второе удаление ограниченного количества данных из таблицы в PostgreSQL

Во второй раз количество записей в таблице также уменьшилось на две штуки.

Уменьшение записей будет продолжаться, пока не закончатся все строки, подходящие под условие.

 

Зачем удалять записи из таблицы в PostgreSQL по чуть-чуть?

Когда сайт или приложение работает с большими объёмами данных, то иногда возникает задача массового удаления записей из таблиц.

Проблема заключается в том, что если записей очень много, то можно надолго заблокировать таблицу для параллельных изменений и вставок.

Чтобы контролировать блокирование таблиц, нужно дозированно запускать удаления для больших объёмов данных.

Как правило этот контроль ложится на клиента СУБД, которым может быть ваш бэкэнд сервер-приложения.

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org

Команда DELETEhttps://postgrespro.ru/docs/postgresql/14/sql-delete