×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

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

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

6.1.98. DELETE

6.1.98. 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. Подробности см. в Раздел 2.4.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 не может быть указан вместе с логическим условием. Подробнее об использовании курсоров с WHERE CURRENT OF см. в DECLARE.

output_expression

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

output_name

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

Результат

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

DELETE count

count — это количество удалённых строк. Обратите внимание, что это число может быть меньше количества строк, соответствующих condition, когда удаления были подавлены триггером BEFORE DELETE. Если count равно 0, ни одна строка не была удалена запросом (это не считается ошибкой).

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

Примечания

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

Хотя для DELETE нет предложения LIMIT, можно добиться аналогичного эффекта, используя метод, описанный в документации по команде UPDATE:

WITH delete_batch AS (
  SELECT l.ctid FROM user_logs AS l
    WHERE l.status = 'archived'
    ORDER BY l.creation_date
    FOR UPDATE
    LIMIT 10000
)
DELETE FROM user_logs AS dl
  USING delete_batch AS del
  WHERE dl.ctid = del.ctid;

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

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

См. также

TRUNCATE
Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению