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.