DELETE
Содержание раздела
Поддерживается в версиях: 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.
Запрос удаляет записи из указанной таблицы — логической таблицы (любого вида), прокси-таблицы или standalone-таблицы — согласно условию, указанному в блоке WHERE
.
Удаление записей логической таблицы возможно из любых СУБД, удаление записей 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
) и может содержать сравнение с константами, подзапросы и 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
, при успешном выполнении запроса; - исключение при неуспешном выполнении запроса.
Столбец sysCn
содержит следующее значение:
- номер выполненной операции записи — при удалении данных из логической таблицы;
- пустое значение — при удалении данных из прокси-таблицы или из внешней writable-таблицы.
Ограничения
Ограничения выполнения
- Выполнение запроса недоступно, если есть незавершенная операция по изменению схемы.
- Не допускается параллельное выполнение идентичных запросов.
Ограничения сущностей
- Запрос доступен для логических таблиц, прокси-таблиц и 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;
Удаление партиционированных записей
-- выбор логической базы данных 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;