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.

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

Если указано предложение WHERE CURRENT OF, то удаляемой строкой считается последняя строка, полученная из указанного курсора.

Предложение WHERE CURRENT OF не поддерживается в копии таблицы.

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

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

Примечание: По умолчанию база данных YMatrix устанавливает эксклюзивную блокировку (EXCLUSIVE lock) на таблицу при выполнении операции DELETE над кучей (heap table). Когда детектор глобальной взаимоблокировки включён, режим блокировки для операции DELETE над кучей становится ROW EXCLUSIVE.

Результат

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

DELETE count

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

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

Параметры

with_query

  • Предложение WITH позволяет задать одну или несколько подзапросов, на которые можно ссылаться по имени в запросе DELETE.
    Для команд DELETE с предложением WITH оно может содержать только операторы SELECT, а не команды модификации данных (INSERT, UPDATE или DELETE).

ONLY

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

table

  • Имя существующей таблицы (может быть указано с указанием схемы).

alias

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

usinglist

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

condition

  • Выражение, возвращающее логическое значение, определяющее, какие строки будут удалены.

cursor_name

  • Имя курсора, используемого в условии WHERE CURRENT OF. Удаляемой строкой является последняя строка, полученная из этого курсора. Курсор должен представлять собой простой негруппирующий запрос к таблице, указанной в цели DELETE.
    Нельзя одновременно указывать WHERE CURRENT OF и булево условие.
    Команда DELETE...WHERE CURRENT OF может выполняться только на сервере, например, в интерактивной сессии psql или скрипте. Языковые расширения (например, PL/pgSQL) не поддерживают обновление курсоров.

output_expression

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

output_name

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

Примечание

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

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

Фактически здесь происходит соединение (join) между таблицами rank и names, и все успешно соединённые строки помечаются как удалённые. Такой синтаксис не является стандартным. Однако такой стиль соединения зачастую проще писать и эффективнее выполнять по сравнению с более стандартным стилем с подзапросом, например:

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

При использовании DELETE для удаления всех строк таблицы (например: DELETE * FROM table;) база данных YMatrix добавляет неявную команду TRUNCATE (если права пользователя это позволяют). Добавленная команда TRUNCATE освобождает дисковое пространство, занимаемое удалёнными строками, без необходимости выполнения VACUUM над таблицей. Это улучшает производительность последующих запросов и полезно для рабочих нагрузок ELT, где часто происходят вставки и удаления в временных таблицах.

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

Примеры

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

DELETE FROM films WHERE kind <> 'Musical';

Очистить таблицу films:

DELETE FROM films;

Удалить завершённые задачи и вернуть полную информацию об удалённых строках:

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

Использовать соединение для удаления:

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

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

Команда соответствует стандарту SQL, за исключением того, что предложения USING и RETURNING являются расширениями базы данных YMatrix, а также возможностью совместного использования конструкций WITH и DELETE.