DELETE#

DELETE

DELETE

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 заставляет DELETE вычислять и возвращать значение(я) на основе каждой фактически удаленной строки. Можно вычислить любое выражение, использующее столбцы таблицы и/или столбцы других таблиц, указанных в USING. Синтаксис списка RETURNING идентичен синтаксису списка вывода SELECT.

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

Параметры

with_query

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

table_name

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

alias

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

from_item

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

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 - это количество удаленных строк. Обратите внимание, что это число может быть меньше количества строк, которые соответствовали condition, когда удаления были подавлены триггером BEFORE DELETE. Если count равно 0, то запросом не было удалено ни одной строки (это не считается ошибкой).

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

Примечания

Tantor BE позволяет ссылаться на столбцы других таблиц в предложении 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;

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

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

См. также

TRUNCATE