Перейти к основному содержимому

DELETE

примечание

Эта страница переведена при помощи нейросети GigaChat.

DELETE - удаление строки из таблицы.

Синтаксис

[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
[ USING from_item [, ...] ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

Описание

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

Совет

TRUNCATE предоставляет более быстрый механизм для удаления всех строк из таблицы.

Существует два способа удалить строки, используя информацию из других таблиц базы данных с помощью подзапросов или с помощью указания дополнительных таблиц в выражении USING. Какой способ использовать — зависит от конкретной ситуации.

Необязательное выражение RETURNING позволяет вычислить и вернуть значения, основанные на каждой удаленной строке. Можно вычислять любые выражения, использующие колонки удаляемой таблицы или таблиц, указанных в USING. Синтаксис RETURNING аналогичен списку вывода в SELECT.

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

Параметры

with_query
Выражение WITH позволяет задать одну или несколько подзапросов, на которые можно ссылаться по имени в команде DELETE. Подробнее смотрите в описании SELECT.
table_name
Имя таблицы, при необходимости дополненное схемой, из которой удаляются строки. Если указано ONLY перед именем таблицы, строки удаляются только из нее. Если ONLY не указано, строки удаляются также из всех наследующих таблиц. Дополнительно можно указать * после имени таблицы, чтобы явно включить дочерние таблицы.
alias
Замещающее имя для целевой таблицы. Когда предоставляется псевдоним, он полностью скрывает фактическое имя таблицы. Например, если дано DELETE FROM foo AS f, остальная часть предложения DELETE должна ссылаться на эту таблицу как f, а не foo.
from_item
Выражение таблицы, позволяющее использовать колонки других таблиц в условии WHERE. Синтаксис такой же, как у FROM команды SELECT. Не указывайте целевую таблицу повторно, если только не хотите сделать замкнутое соединение (в этом случае для данного имени должен определяться псевдоним).
condition
Выражение, которое возвращает значение типа boolean. Удаляются только строки, для которых это выражение возвращает true.
cursor_name
Имя курсора, который будет использоваться в условии WHERE CURRENT OF. Строка, подлежащая удалению, является последней извлеченной из этого курсора. Курсор должен быть запросом без группировки к целевой таблице DELETE. Обратите внимание, что WHERE CURRENT OF не может быть указан вместе с логическим условием. Смотрите DECLARE для получения дополнительной информации об использовании курсоров с WHERE CURRENT OF.
output_expression
Выражение, которое должно быть вычислено и возвращено командой DELETE после удаления каждой строки. Выражение может использовать любые имена столбцов таблицы, указанной в table_name или таблиц(ы), перечисленных в USING. Используйте *, чтобы вернуть все столбцы.
output_name
Имя, назначаемое возвращаемому столбцу.

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

При успешном завершении команда DELETE возвращает тег команды следующего вида:

DELETE count

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

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

Примечания

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

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

Здесь фактически происходит соединение (JOIN) между 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 являются расширениями PostgreSQL, как и возможность использовать WITH с DELETE.

Смотрите также

TRUNCATE