DELETE

DELETE — удалить строки таблицы


Синтаксис

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

Описание

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

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

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

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

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


Параметры

запрос_WITH

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

имя_таблицы

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

псевдоним

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

элемент_FROM

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

условие

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

имя_курсора

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

выражение_результата

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

имя_результата

Имя, используемое для возвращаемого столбца.


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

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

DELETE число

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

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


Примечания

QHB позволяет ссылаться на столбцы других таблиц в условии 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 соответствует стандарту SQL, за исключением того, что предложения USING и RETURNING являются расширениями QHB, как и возможность использовать WITH с этой командой.


См. также

TRUNCATE