DELETE

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

Поддерживается в версиях:  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.

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

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

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

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

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

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

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

Столбец sysCn содержит следующее значение:

  • номер выполненной операции записи — при удалении данных из логической таблицы;
  • пустое значение — при удалении из внешней writable-таблицы.

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

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

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

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

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

Незавершенную операцию по удалению данных можно перезапустить, повторив исходный запрос с ключевым словом 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.

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

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

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

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

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

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

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

Ограничения

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

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

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

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

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

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

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

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

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

  • Запрос не удаляет данные без метки времени, а также данные с меткой времени, превышающей текущее время сервера.
  • 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-01 00:00:00' AND '2023-01-15 23:59:59';
 
-- удаление записей из партиции за февраль 2023
DELETE FROM sales_feb_2023 
WHERE product_code IN ('ABC11', 'ABC0002'); 
 
-- закрытие дельты
COMMIT DELTA;

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