DELETE#
DELETE
DELETE — удаление строк таблицы
Синтаксис
[ WITH [ RECURSIVE ]with_query
[, ...] ] DELETE FROM [ ONLY ]table_name
[ * ] [ [ AS ]alias
] [ USINGfrom_item
[, ...] ] [ WHEREcondition
| WHERE CURRENT OFcursor_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 SE-1C позволяет ссылаться на столбцы других таблиц в предложении 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 SE-1C, также как возможность
использовать WITH
с DELETE
.