DELETE — удаление строк таблицы
[ WITH [ RECURSIVE ]with_query[, ...] ] DELETE FROM [ ONLY ]table_name[ * ] [ [ AS ]alias] [ USINGfrom_item[, ...] ] [ WHEREcondition| WHERE CURRENT OFcursor_name] [ RETURNING { * |output_expression[ [ AS ]output_name] } [, ...] ]
DELETE удаляет строки, удовлетворяющие
предложению WHERE, из указанной таблицы. Если
предложение WHERE отсутствует, результатом будет удаление
всех строк таблицы. Результатом является корректная, но пустая таблица.
TRUNCATE предоставляет
более быстрый механизм удаления всех строк из таблицы.
Существует два способа удаления строк в таблице с использованием информации,
содержащейся в других таблицах базы данных: с использованием подзапросов или
указания дополнительных таблиц в предложении USING.
Какой метод более уместен, зависит от конкретных обстоятельств.
Необязательное предложение RETURNING приводит к тому, что DELETE
вычисляет и возвращает значение(я) на основе каждой фактически удалённой строки.
Может вычисляться любое выражение, использующее столбцы таблицы и/или столбцы других
таблиц, упомянутых в USING.
Синтаксис списка RETURNING идентичен синтаксису выходного списка команды SELECT.
Вы должны иметь привилегию DELETE на таблицу,
из которой удаляете, а также привилегию SELECT
для любой таблицы в предложении USING или
чьи значения читаются в condition.
with_query
Предложение WITH позволяет указать один или несколько
подзапросов, на которые можно ссылаться по имени в запросе DELETE.
Подробности см. в Раздел 2.4.8 и SELECT.
table_name
Имя (возможно, с указанием схемы) таблицы, из которой удаляются строки.
Если перед именем таблицы указано ONLY,
совпадающие строки удаляются только из указанной таблицы. Если
ONLY не указано, совпадающие строки также удаляются
из любых таблиц, наследующих от указанной таблицы. Дополнительно
после имени таблицы может быть указано *, чтобы явно
указать, что потомки включены.
alias
Альтернативное имя целевой таблицы. Если указан псевдоним,
он полностью скрывает фактическое имя таблицы. Например, для команды
DELETE FROM foo AS f в остальной части
оператора DELETE необходимо ссылаться на эту
таблицу как f, а не foo.
from_item
Выражение таблицы, позволяющее столбцам других таблиц появляться
в условии WHERE. Используется тот же
синтаксис, что и для FROM
команды SELECT; например, может быть указан псевдоним
для имени таблицы. Не повторяйте целевую
таблицу как from_item,
если вы не хотите создать самосоединение (в этом случае она должна появиться
с псевдонимом в from_item).
condition
Выражение, возвращающее значение типа boolean.
Только строки, для которых это выражение возвращает true,
будут удалены.
cursor_name
Имя курсора для использования в условии WHERE CURRENT OF.
Удаляемая строка — это строка, извлечённая последней
из этого курсора. Курсор должен быть негруппирующим
запросом к целевой таблице DELETE.
Обратите внимание, что WHERE CURRENT OF не может быть
указан вместе с логическим условием. Подробнее об использовании курсоров с
WHERE CURRENT OF см. в DECLARE.
output_expression
Выражение, которое должно вычисляться и возвращаться командой DELETE
после удаления каждой строки. Выражение может использовать любые
имена столбцов таблицы, указанной в table_name,
или таблиц, перечисленных в USING.
Напишите *, чтобы вернуть все столбцы.
output_nameИмя, которое будет использоваться для возвращаемого столбца.
При успешном завершении команда DELETE возвращает метку
команды вида
DELETE count
count — это количество
удалённых строк. Обратите внимание, что это число может быть меньше количества
строк, соответствующих condition, когда удаления были
подавлены триггером BEFORE DELETE. Если count равно 0, ни одна строка не была удалена
запросом (это не считается ошибкой).
Если команда DELETE содержит предложение RETURNING,
результат будет аналогичен результату команды SELECT,
содержащей столбцы и значения, определённые в списке
RETURNING, вычисленные по строкам, удалённым
командой.
Digital Q.DataBase позволяет ссылаться на столбцы
других таблиц в условии 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;
Хотя для DELETE нет предложения LIMIT,
можно добиться аналогичного эффекта,
используя метод, описанный в документации
по команде UPDATE:
WITH delete_batch AS (
SELECT l.ctid FROM user_logs AS l
WHERE l.status = 'archived'
ORDER BY l.creation_date
FOR UPDATE
LIMIT 10000
)
DELETE FROM user_logs AS dl
USING delete_batch AS del
WHERE dl.ctid = del.ctid;
Эта команда соответствует стандарту SQL, за исключением того,
что предложения USING и RETURNING
являются расширениями Digital Q.DataBase, как и возможность
использовать WITH с DELETE.