DELETE

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

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

Запрос удаляет записи из таблицы согласно указанному условию.

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

В отличие от запросов TRUNCATE HISTORY и TRUNCATE ACTUAL, запрос DELETE не удаляет историю изменений данных.

Поддерживаемые сущности

Удаление записей возможно из следующих таблиц:

Удаление данных из логических и материализованных представлений недоступно.

Особенности удаления данных из партиционированных таблиц и партиций

Одновременная запись данных (загрузка, вставка и удаление) в партиционированную таблицу и ее партиции недоступна: возможна либо запись в партиционированную таблицу, либо параллельная запись данных напрямую в любое количество партиций этой таблицы. При записи данных напрямую в партиции другие партиции таблицы остаются доступны для записи данных.

Подробнее о партиционировании см. в разделе О партиционировании.

Особенности удаления данных из standalone-таблиц

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

Удаление из логических таблиц

Когда удаляются данные из логической таблицы (любого вида), для записей таблицы, соответствующих условию, на физическом уровне проставляется номер текущей версии как последней, в которой эти записи действовали. Таким образом, удаленные записи становятся частью исторических данных.

Удаление из партиционированных таблиц и партиций

При удалении данных из партиционированной таблицы система определяет все задействованные партиции таблицы и из всех таких партиций удаляет записи, соответствующие условию WHERE. Набор задействованных партиций определяется также по условию WHERE; если условие не задано, удаляются все записи всех партиций таблицы.

При удалении данных напрямую из партиции удаляются записи этой партиции, соответствующие условию WHERE.

Удаление из прокси-таблиц и standalone-таблиц

Записи прокси-таблиц и standalone-таблиц удаляются насовсем.

Перезапуск и отмена операций

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

Подробнее о способах обработки незавершенных операций см. в разделе Управление операциями записи.

Статистика

Запросы DELETE учитываются в категории статистики WRITE. Статистика доступна с помощью запроса GET_ENTITY_STATISTICS и GET-методов получения статистики.

Синтаксис

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

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-таблицу.

Логическая таблица может быть любого вида.

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

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

Если ключевое слово не указано, удаляются все записи таблицы.

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

WHERE в запросах к партиционированным таблицам

Условие WHERE в запросе к партиционированной таблице может содержать только следующие операторы:

  • >,
  • >=,
  • <,
  • <=,
  • =,
  • IN,
  • BETWEEN,
  • IS TRUE|FALSE|NULL,
  • IS NOT TRUE|FALSE.

Условие WHERE в запросе к партиционированной таблице может содержать только те логические сущности, которые расположены, как минимум, в тех датасорсах, где расположены партиции, откуда удаляются данные. Например, если партиционированная таблица имеет две партиции (одна размещена в adp, вторая — в adp2), то запрос на удаление данных из этой таблицы можно содержать условие с подзапросом к логической таблице, размещенной в adp, adp2 и adb, но не к таблице, размещенной в adb и adp2 (во втором случае для партиции в adb невозможно вычислить условие).

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

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

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

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

Варианты ответа

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

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

Успешный ответ содержит следующие столбцы:

  • sysCn:
    • номер выполненной операции записи — при удалении данных из логической таблицы;
    • пустое значение — при удалении данных из прокси-таблицы или внешней writable-таблицы;
  • ts:
    • дата и время завершения операции записи в формате YYYY-MM-DD hh:mm:ss.SSSSSS — при выполнении операции вне дельты;
    • пустое значение — при выполнении операции в дельте;
  • rowsAffected — количество затронутых (добавленных, измененных и удаленных) строк. Расчет значения поддерживается для СУБД ADB и ADP.

Запрос с ключевым словом RETRY возвращает в столбце rowsAffected количество строк, затронутых перезапущенной операцией записи, без тех строк, которые успела удалить операция записи до перезапуска.

Ограничения

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

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

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

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

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

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

Ограничения партиционирования

  • Условие в запросе на удаление данных из партиционированной таблицы должно быть вычисляемо в каждом из датасорсов, где расположены данные партиций, из которых удаляются записи.
  • Одновременная запись данных (загрузка, вставка и удаление) в партиционированную таблицу и ее партиции недоступна.

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

  • Запрос не удаляет данные с меткой времени, превышающей текущее время сервера.
  • SELECT-подзапрос, если он указан в условии, должен быть доступен для исполнения во всех датасорсах, где размещена таблица, из которой удаляются данные. В частности, это означает, что запрос на удаление данных из прокси-таблицы или 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;

Удаление партиционированных записей

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

-- открытие новой дельты
BEGIN DELTA;

-- удаление записей за вторую половину января и февраль 2023 из партиционированной таблицы
DELETE FROM sales_partitioned 
WHERE transaction_date BETWEEN '2023-01-16 00:00:00' AND '2023-01-31 23:59:59' OR 
      transaction_date BETWEEN '2023-02-01 00:00:00' AND '2023-02-28 23:59:59';
 
-- удаление записей из партиции за февраль 2023
DELETE FROM sales_feb_2023 
WHERE product_code IN ('ABC11', 'ABC0002'); 
 
-- закрытие дельты
COMMIT DELTA;

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

DELETE FROM marketing.payments_proxy WHERE code IN ('AC', 'AG', 'AK') AND agreement_id <> 100

Удаление записей 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;