Как удалить запись в таблице postgresql
Перейти к содержимому

Как удалить запись в таблице postgresql

  • автор:

PostgreSQL. Как удалить все данные из таблицы большого размера?

Но спустя какое-то время после запуска команды в выводе отобразилось, что удалено N-ое (число было большим) кол-во строк, но размер таблицы остался прежним (полагаю, количество строк также не изменилось). Впервые столкнулся с такой задачей и не знаю, что с этим делать. Собственно, вопрос: как можно удалить все данные из таблицы logs ? У таблицы есть только Primary Key, индексов нет.

Отслеживать
задан 13 апр 2021 в 9:15
Andrei Khotko Andrei Khotko
5,035 19 19 серебряных знаков 54 54 бронзовых знака

Закон подлости: сидел 2 часа не мог найти ответ, и вот спустя 10 минут после того, как задал вопрос, нашел его. Использовал TRUNCATE

13 апр 2021 в 9:24

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Если необходимо удалить именно всё — то нужен truncate .

delete никогда не возвращает дисковое пространство напрямую. PostgreSQL — MVCC база, delete только отмечает строку удалённой. Затем приходит autovacuum (либо вручную вызывается vacuum ), который вычищает из файлов таблицы мёртвые, никому более недоступные версии строк. В конце работы vacuum проверяет, нет ли в конце таблицы страниц данных, в которых не осталось строк. Если есть — то пробует усечь размер таблицы. Размеры индексов сами никогда не уменьшаются (для этого нужен reindex ). Сверх того радости добавляет, что все эти операции пишутся в wal в полном объёме.

truncate же просто выделяет новые пустые датафайлы и удаляет старые. Поэтому для задачи очистить всё — несравнимо эффективнее. Хотя и требует эксклюзивную блокировку.

Отслеживать
ответ дан 13 апр 2021 в 9:44
21.7k 3 3 золотых знака 28 28 серебряных знаков 53 53 бронзовых знака

  • база-данных
  • postgresql
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.3.1.5619

Как удалить запись в таблице postgresql

Для удаления данных в PostgreSQL применяется команда DELETE . Она имеет следующий синтаксис:

DELETE FROM имя_таблицы [WHERE условие_удаления]

Например, удалим строки, у которых производитель — Apple:

DELETE FROM Products WHERE Manufacturer='Apple';

DELETE и удаление данных в PostgreSQL

Или удалим все товары, производителем которых является HTC и которые имеют цену меньше 35000:

DELETE FROM Products WHERE Manufacturer='HTC' AND Price < 15000;

Если необходимо вовсе удалить все строки вне зависимости от условия, то условие можно не указывать:

DELETE FROM Products;

PostgreSQL оператор DELETE

В этом учебном пособии вы узнаете, как использовать PostgreSQL оператор DELETE с синтаксисом и примерами.

Описание

Оператор PostgreSQL DELETE используется для удаления одной или нескольких записей из таблицы в PostgreSQL.

Синтаксис

Синтаксис оператора DELETE в PostgreSQL:

DELETE FROM table
[WHERE conditions];

Параметры или аргументы

table Таблица, из которой вы хотите удалить записи. WHERE conditions Необязательный. Условия, которые должны быть выполнены для удаления записей. Если никаких условий не предоставлено, все записи из таблицы будут удалены.

Примечание

  • Вам не нужно перечислять поля в PostgreSQL операторе DELETE, поскольку вы удаляете всю строку из таблицы.

Пример - с одним условием

Рассмотрим простой пример, где у нас есть только одно условие в операторе DELETE.
Например:

Как удалить запись в таблице postgresql

DELETE — удалить записи таблицы

Синтаксис

[ WITH [ RECURSIVE ] запрос_WITH [, . ] ] DELETE FROM [ ONLY ] имя_таблицы [ * ] [ [ AS ] псевдоним ] [ USING элемент_FROM [, . ] ] [ WHERE условие | WHERE CURRENT OF имя_курсора ] [ RETURNING * | выражение_результата [ [ AS ] имя_результата ] [, . ] ]

Описание

Команда DELETE удаляет из указанной таблицы строки, удовлетворяющие условию WHERE . Если предложение WHERE отсутствует, она удаляет из таблицы все строки, в результате будет получена рабочая, но пустая таблица.

Подсказка

TRUNCATE — расширение PostgreSQL , реализующее более быстрый механизм удаления всех строк из таблицы.

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

Предложение RETURNING указывает, что команда DELETE должна вычислить и возвратить значения для каждой фактически удалённой строки. Вычислить в нём можно любое выражение со столбцами целевой таблицы и/или столбцами других таблиц, упомянутых в USING . Список RETURNING имеет тот же синтаксис, что и список результатов SELECT .

Чтобы удалять данные из таблицы, необходимо иметь право DELETE для неё, а также право SELECT для всех таблиц, перечисленных в предложении USING , и таблиц, данные которых считываются в условии .

Параметры

запрос_WITH

Предложение WITH позволяет задать один или несколько подзапросов, на которые затем можно ссылаться по имени в запросе DELETE . Подробнее об этом см. Раздел 7.8 и SELECT . имя_таблицы

Имя (возможно, дополненное схемой) таблицы, из которой будут удалены строки. Если перед именем таблицы добавлено ONLY , соответствующие строки удаляются только из указанной таблицы. Без ONLY строки будут также удалены из всех таблиц, унаследованных от указанной. При желании, после имени таблицы можно указать * , чтобы явно обозначить, что операция затрагивает все дочерние таблицы. псевдоним

Альтернативное имя целевой таблицы. Когда указывается это имя, оно полностью скрывает фактическое имя таблицы. Например, в запросе DELETE FROM foo AS f дополнительные компоненты оператора DELETE должны обращаться к целевой таблице по имени f , а не foo . элемент_FROM

Табличное выражение, позволяющее добавить в условие WHERE столбцы из других таблиц. В этом выражении используется тот же синтаксис, что и в предложении Предложение FROM оператора SELECT ; например, в нём можно определить псевдоним для таблицы. Повторять в нём имя целевой таблицы нужно, только если требуется определить замкнутое соединение (в этом случае для данного имени должен определяться псевдоним). условие

Выражение, возвращающее значение типа boolean . Удалены будут только те строки, для которых это выражение возвращает true . имя_курсора

Имя курсора, который будет использоваться в условии WHERE CURRENT OF . С таким условием будет удалена строка, выбранная из этого курсора последней. Курсор должен образовываться запросом, не применяющим группировку, к целевой таблице команды DELETE . Заметьте, что WHERE CURRENT OF нельзя задать вместе с логическим условием. За дополнительными сведениями об использовании курсоров с WHERE CURRENT OF обратитесь к DECLARE . выражение_результата

Выражение, которое будет вычисляться и возвращаться командой DELETE после удаления каждой строки. В этом выражении можно использовать имена любых столбцов таблицы имя_таблицы или таблиц, перечисленных в списке USING . Чтобы получить все столбцы, достаточно написать * . имя_результата

Имя, назначаемое возвращаемому столбцу.

Выводимая информация

В случае успешного завершения, DELETE возвращает метку команды в виде

DELETE число 

Здесь число — количество удалённых строк. Заметьте, что это число может быть меньше числа строк, соответствующих условию , если удаления были подавлены триггером BEFORE DELETE . Если число равно 0, это означает, что запрос не удалил ни одной строки (это не считается ошибкой).

Если команда DELETE содержит предложение RETURNING , её результат будет похож на результат оператора SELECT (с теми же столбцами и значениями, что содержатся в списке RETURNING ), полученный для строк, удалённых этой командой.

Замечания

PostgreSQL позволяет ссылаться на столбцы других таблиц в условии WHERE , когда эти таблицы перечисляются в предложении USING . Например, удалить все фильмы определённого продюсера можно так:

DELETE FROM films USING producers WHERE producer_id = producers.id AND producers.name = 'foo';

По сути в этом запросе выполняется соединение таблиц films и producers , и все успешно включённые в соединение строки в films помечаются для удаления. Этот синтаксис не соответствует стандарту. Следуя стандарту, эту задачу можно решить так:

DELETE FROM films WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');

В ряде случаев запрос в стиле соединения легче написать и он может работать быстрее, чем в стиле вложенного запроса.

Примеры

Удаление всех фильмов, кроме мюзиклов:

DELETE FROM films WHERE kind <> 'Musical';

Очистка таблицы films :

DELETE FROM films;

Удаление завершённых задач с получением всех данных удалённых строк:

DELETE FROM tasks WHERE status = 'DONE' RETURNING *;

Удаление из tasks строки, на которой в текущий момент располагается курсор c_tasks :

DELETE FROM tasks WHERE CURRENT OF c_tasks;

Совместимость

Эта команда соответствует стандарту SQL , но предложения USING и RETURNING являются расширениями PostgreSQL , как и возможность использовать WITH с DELETE .

Пред. Наверх След.
DECLARE Начало DISCARD

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *