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 имя целевой таблицы, если не хотите
установить замкнутое соединение (в этом случае это имя должно фигурировать в
элементе_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');
В некоторых случаях нотацию в стиле соединения легче написать, и она может
выполняться быстрее, чем нотация в стиле подзапроса SELECT.
Примеры
Удаление всех фильмов, кроме мюзиклов:
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 являются расширениями QHB, как и возможность использовать WITH с этой командой.