DELETE
Содержание раздела
Поддерживается в версиях: 7.6 / 7.5 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.12 / 6.11 / 6.10 / 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 не удаляет историю данных.
Поддерживаемые сущности
Удаление данных доступно из сущностей и СУБД, перечисленных ниже.
| Целевая таблица | ADP | ADB | ADG | ADQM |
|---|---|---|---|---|
| Обычная логическая таблица | + | + | + | + |
| Партиционированная таблица, партиция или снапшот-таблица* | + | – | – | – |
| Прокси- или standalone-таблица | + | + | – | – |
* Партицированные таблицы, партиции и снапшот-таблицы могут размещаться только в ADP.
Особенности удаления данных из партиционированных таблиц и партиций
Одновременное удаление данных из партиционированной таблицы и ее партиций недоступно: возможно либо удаление из партиционированной таблицы, либо параллельное удаление напрямую из любого количества партиций этой таблицы.
Подробнее о партиционировании см. в разделе О партиционировании.
Особенности удаления данных из standalone-таблиц
Удаление данных из standalone-таблиц выполняется через внешние writable-таблицы.
Как работает запрос
Выбор датасорса-источника для SELECT-подзапроса в WHERE
Если запрос содержит SELECT-подзапрос в условии WHERE, источником данных служит датасорс (по убыванию приоритета):
- указанный в DATASOURCE_TYPE;
- подходящий для партиционированных и снапшот-таблиц подзапроса:
- первый по алфавиту среди подходящих для снапшот-таблиц со строгой консистентностью данных;
- наиболее подходящий для чтения/трансфера данных партиционированной или снапшот-таблицы, служащей источником/приемником;
- каждый целевой датасорс сам для себя (при наличии в них данных SELECT);
- подходящий для всех сущностей SELECT-подзапроса:
- [HTTP] вычисленный по queryId из подходящих;
- случайный из подходящих.
Удаление из логических таблиц
При удалении из логической таблицы записи переводятся в категорию исторических: на физическом уровне для них проставляется номер текущей версии как последней, в которой эти записи действовали, и признак удаления (sys_op = 1).
Удаление из снапшот-таблиц
Порядок удаления записей из снапшот-таблицы зависит от значения ее опций set.delete.tracking.enable и set.on.conflict.do, как показано ниже.
| Значение set.delete.tracking.enable | Значение set.on.conflict.do | Обработка записей к удалению |
|---|---|---|
| true | update | Записи помечаются как удаленные (sys_op = 1) |
| true | error | Все изменения по запросу отбрасываются и возвращается ошибка |
| true | nothing | Все изменения по запросу пропускаются и возвращается успешный ответ |
| false | update / error / nothing | Записи удаляются окончательно |
В отличие от логических таблиц, снапшот-таблицы не хранят исторические записи: каждая запись содержит либо текущее состояние объекта, либо информацию об удалении объекта (если включено отслеживание удалений).
Удаление из прокси-таблиц и standalone-таблиц
Записи прокси-таблиц и standalone-таблиц удаляются окончательно.
Выполнение при отключенном датасорсе
Отключенный датасорс пропускается при исполнении запроса. Удаление данных считается успешным, если данные сохранены в необходимые датасорсы.
Статистика
Запросы DELETE учитываются в категории WRITE статистики. Подробнее о категориях запросов в статистике см. в разделе GET_ENTITY_STATISTICS, о способах просмотра статистики — в разделе Управление статистикой.
Перезапуск и отмена операций
Кластер с кворумом нод автоматически отменяет сбойные операции записи при типовых сбоях, исключая необходимость ручного вмешательства.
Возможности по ручному управлению операциями описаны в разделе Управление операциями записи.
Синтаксис
Удаление записей:
DELETE FROM [db_name.]table_name [WHERE condition]
Перезапуск операции по удалению записей:
RETRY DELETE FROM [db_name.]table_name [WHERE condition]
Параметры:
db_name-
Имя логической базы данных. Опционально, если выбрана логическая БД, используемая по умолчанию.
table_name-
Имя таблицы, из которой удаляются записи. Возможные значения:
- имя логической таблицы,
- имя снапшот-таблицы,
- имя прокси-таблицы,
- имя внешней writable-таблицы, указывающей на нужную standalone-таблицу.
Логическая таблица может быть любого вида.
Ключевое слово WHERE condition
Задает условие выбора удаляемых записей. Может содержать сравнение с константами, SELECT-подзапросы и JOIN-соединения.
Если ключевое слово не указано, удаляются все записи таблицы.
Особенности SELECT-подзапросов в WHERE
Удаление с использованием SELECT-подзапроса доступно в любом из следующих случаев:
- [локальное исполнение] все целевые датасорсы содержат выбираемые данные;
- [трансфер между датасорсами] выбранный датасорс-источник также является одним из целевых датасорсов и поддерживает трансфер данных во все остальные целевые датасорсы (см. таблицу ниже).
В таблице ниже показаны сочетания типов датасорсов, между которыми поддерживается трансфер данных при исполнении запроса.
| Сущности-источники | Таблица-приемник | Датасорс-источник | Целевой датасорс | |||
|---|---|---|---|---|---|---|
| ADP | ADG | ADQM | ADB | |||
| Любые, кроме снапшот-таблиц | Любая из поддерживаемых | ADP | + | + | – | – |
| ADB | + | + | + | – | ||
| Снапшот-таблицы | Логическая или снапшот-таблица | ADP | + | – | – | – |
| Прокси- или standalone-таблица | ADP | + | + | – | – | |
Датасорсы таблицы можно указать при ее создании. Датасорсы существующей таблицы можно изменять для логических таблиц и снапшот-таблиц командами ALTER TABLE ADD DATASOURCE (добавляет датасорс) и DROP TABLE … DATASOURCE_TYPE (удаляет датасорс).
Особенности партиционированных таблиц
Условие WHERE в запросе к партиционированной таблице может содержать операторы:
>,>=,<,<=,=,IN,BETWEEN,IS TRUE|FALSE|NULL,IS NOT TRUE|FALSE.
Условие WHERE в запросе к партиционированной таблице может содержать только логические сущности, размещенные, как минимум, в датасорсах партиций, откуда удаляются данные. Например, если партиция 1 размещена в adp, а партиция 2 — в adp2:
- [поддерживается] условие с таблицей в
adp,adp2иadb(есть пересечение с обеими партициями); - [не поддерживается] условие с таблицей в
adp2иadb(нет пересечения с партицией 1).
Ключевое слово RETRY
При типовых сбоях (перебои в сети, сбой ноды и т.п.) операции отменяются автоматически и не требуют ручного управления с помощью RETRY или других команд.
Перезапускает обработку операции записи со статусом 0 (Выполняется) в логической таблице. Если указано, после него должна следовать копия исходного запроса, создавшего перезапускаемую операцию.
Не поддерживается для других таблиц:
- игнорируется для прокси- и standalone-таблиц;
- приводит к ошибке для снапшот-таблиц.
Если ключевое слово не указано, система обрабатывает запрос как новый, а не перезапущенный.
Варианты ответа
В ответе возвращается:
- объект ResultSet c одной записью при успешном выполнении запроса;
- исключение при неуспешном выполнении запроса.
Успешный ответ содержит столбцы:
sysCn:- номер выполненной операции записи — при удалении из логической или снапшот-таблицы;
- пустое значение — при удалении из прокси-таблицы или внешней writable-таблицы;
ts:- дата и время завершения операции записи в формате
YYYY-MM-DD hh:mm:ss.SSSSSS— при выполнении операции вне дельты; - пустое значение — при выполнении операции в дельте;
- дата и время завершения операции записи в формате
rowsAffected— количество затронутых (добавленных, измененных и удаленных) строк. Расчет значения поддерживается для СУБД ADB и ADP.
Запрос с RETRY возвращает в rowsAffected количество строк, затронутых перезапущенной операцией записи. Строки, обработанные до перезапуска операции, не учитываются.
Ограничения
Ограничения выполнения
- Выполнение запроса к логической или снапшот-таблице недоступно, если она участвует в незавершенной операции по изменению схемы.
- Выполнение запроса вне дельты недоступно, если последняя дельта закрыта с меткой времени, превышающей серверное время.
- Не допускается параллельное выполнение идентичных запросов.
Ограничения сущностей
- Запрос доступен для логических, снапшот-, прокси- и standalone-таблиц.
- Удаление записей standalone-таблиц и прокси-таблиц доступно только из СУБД ADB и ADP.
- Невозможно удаление записей из снапшот-таблиц с комбинациями опций:
set.delete.tracking.enable=true+set.on.conflict.do=error(возвращается ошибка);set.delete.tracking.enable=true+set.on.conflict.do=nothing(удаление пропускается без ошибки).
Ограничения ключевых слов
- В условии
WHEREне допускается использование функций, которые приводят к разным результатам в разных СУБД. Примеры таких функций — это операции над числами с плавающей запятой: сравнение с ними, округление и т.д. - Ключевое слово
RETRYдоступно только для логических таблиц; для других таблиц игнорируется или приводит к ошибке.
Ограничения партиционирования
- Условие в запросе на удаление данных из партиционированной таблицы должно быть вычисляемо в каждом из датасорсов, где расположены данные партиций, из которых удаляются записи.
- Одновременная запись данных (загрузка, вставка и удаление) в партиционированную таблицу и ее партиции недоступна.
Другие ограничения
- Запрос не удаляет данные с меткой времени, превышающей текущее время сервера.
- При обработке запроса отключенные (Датасорс, отключенный системой из-за сбоя или администратором
) датасорсы (СУБД или кластер СУБД хранилища
) пропускаются без возврата ошибки. Ошибка возвращается, если не осталось включенных (Датасорс, работающий в штатном режиме
) датасорсов, необходимых для записи данных.
Примеры
Удаление записей логической таблицы в дельте
-- выбор логической базы данных 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;
Удаление записей снапшот-таблицы
DELETE FROM marketing.sales_snapshot WHERE transaction_date < DATE_TRUNC(YEAR, TIMESTAMPADD(YEAR, -1, current_date))
Удаление партиционированных записей
-- выбор логической базы данных 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 type_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;