DELETE
Содержание раздела
Поддерживается в версиях: 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
не удаляет историю изменений данных.
Поддерживаемые сущности
Удаление записей возможно из следующих таблиц:
- логической таблицы любого вида;
- прокси-таблицы, размещенной в ADB или ADP;
- standalone-таблиц, размещенной в ADB или ADP.
Удаление данных из логических и материализованных представлений недоступно.
Особенности удаления данных из партиционированных таблиц и партиций
Одновременная запись данных (загрузка, вставка и удаление) в партиционированную таблицу и ее партиции недоступна: возможна либо запись в партиционированную таблицу, либо параллельная запись данных напрямую в любое количество партиций этой таблицы. При записи данных напрямую в партиции другие партиции таблицы остаются доступны для записи данных.
Подробнее о партиционировании см. в разделе О партиционировании.
Особенности удаления данных из 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
). Может содержать сравнение с константами, SELECT-подзапросы и JOIN-соединения.
При наличии SELECT-подзапроса в условии удаление записей возможно в случаях:
- список датасорсов, где исполним подзапрос, полностью включает список датасорсов целевой таблицы (например, запрос исполним в
adqm
,adp
иadp2
, а записи удаляются изadqm
иadp2
); - подзапрос исполним в датасорсе типа ADB, и записи удаляются из датасорсов типа ADP, ADG и (или) ADQM;
- подзапрос исполним в датасорсе типа ADP, и записи удаляются из датасорсов типа ADP и (или) ADG.
Если ключевое слово не указано, удаляются все записи таблицы.
WHERE в запросах к партиционированным таблицам
Условие WHERE
в запросе к партиционированной таблице может содержать операторы:
>
,>=
,<
,<=
,=
,IN
,BETWEEN
,IS TRUE|FALSE|NULL
,IS NOT TRUE|FALSE
.
Условие WHERE
в запросе к партиционированной таблице может содержать только те логические сущности, которые расположены, как минимум, в тех датасорсах, где расположены партиции, откуда удаляются данные. Например, если партиционированная таблица имеет две партиции (одна размещена в adp
, вторая — в adp2
), то запрос на удаление данных из этой таблицы можно содержать условие с подзапросом к логической таблице, размещенной в adp
, adp2
и adb
, но не к таблице, размещенной в adb
и adp2
(во втором случае для партиции в adb
невозможно вычислить условие).
Ключевое слово RETRY
Ключевое слово RETRY
перезапускает обработку незавершенной операции записи со статусом 0 («Выполняется») и поддерживается только для логических таблиц. Подробнее обо всех способах перезапуска и отмены операций см. в разделе Управление операциями записи.
Запрос с 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 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;