DELETE

Содержание раздела
  1. Синтаксис
    1. Ключевое слово WHERE
    2. Ключевое слово RETRY
  2. Ограничения
    1. Ограничения выполнения
    2. Ограничения сущностей
    3. Ограничения ключевых слов
    4. Другие ограничения
  3. Примеры
    1. Удаление записей логической таблицы в дельте
    2. Удаление записей логической таблицы вне дельты
    3. Удаление записей standalone-таблицы
    4. Перезапуск операции по удалению записей

Поддерживается в версиях:  6.3 / 6.2 / 6.1 / 6.0 / 5.8 / 5.7 / 5.6 / 5.5 / 5.4 / 5.3 / 5.2.

Запрос удаляет записи логической таблицы или standalone-таблицы согласно условию, указанному в блоке WHERE. Удаление данных из логических и материализованных представлений недоступно.

Синтаксис удаления из standalone-таблицы подразумевает использование внешней writable-таблицы, которая указывает на нужную standalone-таблицу.

Удаление записей логической таблицы возможно из любых СУБД, удаление записей standalone-таблицы — из СУБД ADB и ADP.

Чтобы удалить большой объем данных, используйте загрузку данных.

Запрос обрабатывается в порядке, описанном в разделе Порядок обработки запросов на обновление данных.

В ответе возвращается:

  • объект ResultSet c одной записью, содержащей номер операции записи, при успешном выполнении запроса;
  • исключение при неуспешном выполнении запроса.

При успешном выполнении запроса для записей логической таблицы, соответствующих условию, на физическом уровне проставляется номер текущей версии как последней, в которой эти записи действовали. Записи standalone-таблицы удаляются насовсем и не могут быть восстановлены средствами системы.

Запрос не удаляет историю изменений данных.
Способы удаления истории изменений см. в разделе Управление историей изменений данных

Если в условии указан SELECT-подзапрос, он должен быть доступен для исполнения во всех датасорсах, где размещены удаляемые данные таблицы.
Например, можно удалить данные таблицы, размещенные в датасорсах adb и adqm2, если подзапрос доступен в датасорсах adb, adqm2 и adp, но невозможно удалить данные той же таблицы, если подзапрос доступен только в adb.

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

По умолчанию система ведет статистику обработки запросов к данным. Запросы DELETE учитываются в категории WRITE. Чтобы получить статистику, выполните GET_ENTITY_STATISTICS.

Синтаксис

Удаление записей:

DELETE FROM [db_name.]table_name [WHERE filter_expression]

Перезапуск операции по удалению записей:

RETRY DELETE FROM [db_name.]table_name [WHERE filter_expression]

Параметры:

db_name

Имя логической базы данных. Опционально, если выбрана логическая БД, используемая по умолчанию.

table_name

Имя таблицы, из которой удаляются записи. Возможные значения:

  • имя логической таблицы,
  • имя внешней writable-таблицы, указывающей на нужную standalone-таблицу.
filter_expression

Условие выбора удаляемых записей. Может содержать сравнение с константами, подзапросы и JOIN-соединения.

Ключевое слово WHERE

Ключевое слово WHERE задает условие выбора удаляемых записей. Если ключевое слово не указано, удаляются все записи таблицы. См. также параметр filter_expression.

Ключевое слово RETRY

Ключевое слово перезапускает обработку незавершенной операции записи, созданной запросом DELETE. Если ключевое слово не указано, система создает новую операцию и обрабатывает ее.

Пример запроса с ключевым словом RETRY см. ниже. Список незавершенных операций можно получить с помощью запроса GET_WRITE_OPERATIONS.

Перезапуск с ключевым словом RETRY доступен только для операций со статусом «Выполняется». Чтобы перезапустить операцию со статусом «Отменяется», выполните RESUME_WRITE_OPERATION. Подробнее о способах перезапуска и отмены операций см. в разделе Управление операциями записи.

Ключевое слово RETRY недоступно в запросах к standalone-таблицам.

Ограничения

Ограничения выполнения

  • Выполнение запроса недоступно, если есть незавершенная операция по изменению схемы.
  • Не допускается параллельное выполнение идентичных запросов.

Ограничения сущностей

  • Запрос доступен только для логических таблиц и standalone-таблиц.
  • Удаление записей из standalone-таблиц доступно для СУБД ADB и ADP.

Ограничения ключевых слов

  • В условии WHERE не допускается использование функций, которые приводят к разным результатам в разных СУБД. Примеры таких функций — это операции над числами с плавающей запятой: сравнение с ними, округление и т.д.
  • Ключевое слово RETRY недоступно в запросах к standalone-таблицам.

Другие ограничения

  • Запрос не удаляет данные без метки времени, а также данные с меткой времени, превышающей текущее время сервера.
  • SELECT-подзапрос, если он указан в условии, должен быть доступен для исполнения во всех датасорсах, где размещены удаляемые данные таблицы.

Примеры

Удаление записей логической таблицы в дельте

-- выбор логической базы данных marketing в качестве базы данных по умолчанию
USE marketing;

-- открытие новой (горячей) дельты
BEGIN DELTA;

-- удаление записей по условию с константой
DELETE FROM sales WHERE store_id = 234;

-- удаление записей по условию с подзапросом
DELETE FROM sales WHERE store_id IN (SELECT id FROM stores WHERE region = 'Калуга' OR region = 'Нижний Новгород');

-- закрытие дельты
COMMIT DELTA;

Удаление записей логической таблицы вне дельты

-- удаление записей по условию с константой вне дельты
DELETE FROM marketing.sales WHERE store_id < 123;

Удаление записей standalone-таблицы

-- удаление записей standalone-таблицы, на которую указывает внешняя writable-таблица agreements_ext_write_adp
DELETE FROM marketing.agreements_ext_write_adp WHERE client_id < 150;

Перезапуск операции по удалению записей

-- выбор логической базы данных marketing в качестве базы данных по умолчанию
USE marketing;

-- открытие новой (горячей) дельты
BEGIN DELTA;

-- удаление записей логической таблицы sales о покупках в магазине
DELETE FROM sales WHERE store_id = 123;

-- перезапуск обработки операции по удалению записей
RETRY DELETE FROM sales WHERE store_id = 123;

-- закрытие дельты
COMMIT DELTA;