Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

DELETE

Удаляет строки из таблицы.

Синтаксис

[WITH [RECURSIVE] <with_query> [, ...]]
DELETE FROM [ONLY] <table> [[AS] <alias>]
      [USING <usinglist>]
      [WHERE <condition> | WHERE CURRENT OF <cursor_name>]
      [RETURNING * | <output_expression> [[AS] <output_name>] [, ...]]

Описание

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

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

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

Если указано условие WHERE CURRENT OF, удаляется строка, которая была извлечена последней из указанного курсора. Условие WHERE CURRENT OF не поддерживается для реплицированных таблиц.

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

ПРИМЕЧАНИЕ

Выражение RETURNING не поддерживается при удалении из оптимизированных для добавления (Append-optimized, AO) таблиц.

Для удаления данных из таблицы необходимо иметь привилегию DELETE на эту таблицу.

ПРИМЕЧАНИЕ

По умолчанию Greengage DB устанавливает блокировку EXCLUSIVE на таблицы для операций DELETE на heap-таблицах. Если включен процесс обнаружения взаимных блокировок (Global Deadlock Detector), режим блокировки для операций DELETE на heap-таблицах изменяется на ROW EXCLUSIVE.

Вывод

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

DELETE <count>

где count — количество удаленных строк. Если count равен 0, запрос не удалил ни одной строки (это не считается ошибкой).

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

Параметры

Параметр Описание

with_query

Выражение WITH позволяет указать один или несколько подзапросов, на которые можно ссылаться по имени в запросе DELETE.

В команде DELETE, включающей выражение WITH, это выражение может содержать только операторы SELECT. Выражение WITH не может содержать команды изменения данных (INSERT, UPDATE или DELETE).

Подробнее см. в разделах Общие табличные выражения (CTE) и SELECT

ONLY

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

table

Имя существующей таблицы (при необходимости с указанием схемы)

alias

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

usinglist

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

condition

Выражение типа boolean, определяющее, какие строки удалить

cursor_name

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

WHERE CURRENT OF нельзя использовать вместе с логическим условием.

Оператор DELETE …​ WHERE CURRENT OF может выполняться только на сервере, например, в интерактивной сессии psql или в скрипте. Языковые расширения, такие как PL/pgSQL, не поддерживают обновляемые курсоры.

Дополнительную информацию о создании курсоров см. в разделе DECLARE

output_expression

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

output_name

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

Примечания

В Greengage DB можно ссылаться на столбцы других таблиц в условии WHERE, указав эти таблицы в USING. Например, чтобы удалить из таблицы rank строку с именем Hannah, выполните:

DELETE
FROM rank USING names
WHERE names.id = rank.id
  AND name = 'Hannah';

По сути, здесь выполняется соединение таблиц rank и names, при этом все совпавшие строки помечаются для удаления. Данный синтаксис не является стандартным SQL. Однако обычно он проще в написании и быстрее выполняется, чем стандартный вариант с вложенными подзапросами, например:

DELETE FROM rank
WHERE id IN (SELECT id FROM names WHERE name = 'Hannah');

Выполнение команд UPDATE и DELETE непосредственно на конкретной партиции (дочерней таблице) партиционированной таблицы не поддерживается. Вместо этого операции следует выполнять на родительской партиционированной таблице, созданной с помощью команды CREATE TABLE.

Для партиционированной таблицы все дочерние таблицы блокируются во время операции DELETE, если Global Deadlock Detector отключен (по умолчанию). Если Global Deadlock Detector включен, блокируются только некоторые конечные дочерние таблицы.

Примеры

Удаление всех фильмов, кроме тех, которые имеют жанр Musical:

DELETE FROM films
WHERE kind <> 'Musical';

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

DELETE FROM films;

Удаление задач со статусом DONE с возвратом всех столбцов удаленных строк:

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

Удаление строк с использованием соединения таблиц:

DELETE
FROM rank USING names
WHERE names.id = rank.id
  AND name = 'Hannah';

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

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

См. также