Обновление данных
Содержание раздела
Система позволяет обновлять небольшие объемы данных: добавлять новые записи, изменять и удалять текущие записи.
Можно обновлять данные следующих логических сущностей:
Обновление данных логических и материализованных представлений недоступно.
Под небольшим объемом данных подразумеваются десятки записей. Чтобы обновить большой объем данных, используйте загрузку данных.
Подготовка сущностей для обновления данных standalone-таблицы
Для обновления данных standalone-таблицы стало доступным, необходимо создать для нее соответствующую внешнюю writable-таблицу.
Чтобы создать внешнюю writable-таблицу, выполните запрос CREATE WRITABLE EXTERNAL TABLE:
- если standalone-таблица отсутствует и ее нужно создать при создании внешней таблицы, укажите в запросе ключевое слово
OPTIONS
со значениемauto.create.table.enable=true
, - иначе выполните запрос без ключевого слова
OPTIONS
.
Обновление данных
Чтобы обновить данные:
- Если необходимо обновить данные логической таблицы и включить операцию обновления в дельту, а дельта еще не открыта, откройте ее.
- Выполните запрос INSERT VALUES, INSERT SELECT, UPSERT VALUES или DELETE:
- чтобы выполнить запрос в синхронном режиме, отправьте его по JDBC или по REST API с помощью POST-метода query без параметра async (или с параметром
async
, имеющим значениеfalse
); - чтобы выполнить запрос в асинхронном режиме, отправьте его по REST API с помощью POST-метода query, где в теле сообщения укажите параметр async со значением
true
.
- чтобы выполнить запрос в синхронном режиме, отправьте его по JDBC или по REST API с помощью POST-метода query без параметра async (или с параметром
- Если данные обновлялись в логической таблице в рамках дельты и эта операция обновления должна быть последней в дельте, закройте дельту.
При обновлении данных в прокси-таблицах и standalone-таблицах учитывайте ограничения таблиц целевой СУБД.
Вставка данных в standalone-таблицу запросом UPSERT VALUES
недоступна, если запрос содержит внешнюю writable-таблицу без первичного ключа.
Примеры
Обновление данных логических таблиц
-- выбор логической базы данных marketing в качестве базы данных по умолчанию
USE marketing;
-- создание логической таблицы sales_july_2021, которая будет содержать данные о продажах за июль 2021 и размещаться в датасорсе adb
CREATE TABLE sales_july_2021 (
id BIGINT NOT NULL,
transaction_date TIMESTAMP NOT NULL,
product_code VARCHAR(256) NOT NULL,
product_units BIGINT NOT NULL,
store_id BIGINT NOT NULL,
description VARCHAR(256),
PRIMARY KEY (id)
) DISTRIBUTED BY (id)
DATASOURCE_TYPE ('adb');
-- вставка двух записей в логическую таблицу sales вне дельты
INSERT INTO sales
VALUES (900011, '2021-07-11 23:34:10', 'ABC0004', 2, 123, 'Покупка по акции "1+1"'),
(900012, '2021-07-23 10:05:56', 'ABC0017', 5, 234, 'Покупка без акций');
-- открытие новой дельты
BEGIN DELTA;
-- вставка трех записей в логическую таблицу sales в дельте
INSERT INTO sales
VALUES (100011, '2021-08-21 23:34:10', 'ABC0001', 2, 123, 'Покупка по акции "1+1"'),
(100012, '2021-08-22 10:05:56', 'ABC0001', 1, 234, 'Покупка без акций'),
(1000113, '2021-08-22 13:17:47', 'ABC0002', 4, 123, 'Покупка по акции "Лето"');
-- удаление записей логической таблицы sales в дельте
DELETE FROM sales WHERE store_id = 234;
-- вставка данных из таблицы sales в таблицу sales_july_2021 в дельте
INSERT INTO sales_july_2021
SELECT * FROM sales WHERE CAST(EXTRACT(MONTH FROM transaction_date) AS INT) = 7 AND
CAST(EXTRACT(YEAR FROM transaction_date) AS INT) = 2021 DATASOURCE_TYPE = 'adb';
-- закрытие дельты
COMMIT DELTA;
Обновление данных прокси-таблиц
-- вставка трех записей в прокси-таблицу
INSERT INTO marketing.payments_proxy
VALUES (100, 111111, 'AC', 12002.53, 'RUB', 'Check number 12345'),
(101, 222222, 'AG', 450.00, 'RUB', 'Check number 4583'),
(102, 333333, 'AG', 2630.30, 'RUB', 'Check number 3753')
Обновление данных standalone-таблиц
-- вставка записей в standalone-таблицу, на которую указывает внешняя writable-таблица agreements_ext_write_adp
INSERT INTO marketing.agreements_ext_write_adp
VALUES (100, 111111, 'AB12345', '2022-02-01', '2022-02-02', '2024-02-02', 'Договор с ООО "Квадрат"'),
(101, 222222, 'AB67890', '2022-02-11', '2022-02-12', '2025-02-12', 'Договор с ООО "Круг"');
-- удаление записей по одному клиенту
DELETE FROM marketing.agreements_ext_write_adp WHERE client_id = 234;
-- создание внешней writable-таблицы с созданием связанной standalone-таблицы в датасорсе adg
CREATE WRITABLE EXTERNAL TABLE marketing.sales_ext_write_adg (
id BIGINT NOT NULL,
transaction_date TIMESTAMP NOT NULL,
product_code VARCHAR(256) NOT NULL,
product_units BIGINT NOT NULL,
store_id BIGINT NOT NULL,
description VARCHAR(256),
PRIMARY KEY (id)
)
DISTRIBUTED BY (id)
LOCATION 'core:adg://dtm__marketing__sales'
OPTIONS ('auto.create.table.enable=true');
-- вставка данных из логической таблицы sales в standalone-таблицу, на которую указывает внешняя writable-таблица sales_ext_write_adg
INSERT INTO marketing.sales_ext_write_adg SELECT * FROM marketing.sales DATASOURCE_TYPE = 'adg';
Перезапуск операций по обновлению данных
-- выбор логической базы данных marketing_new в качестве базы данных по умолчанию
USE marketing_new;
-- открытие новой дельты
BEGIN DELTA;
-- вставка записи в логическую таблицу sales без опционального значения description
UPSERT INTO sales
(id, transaction_date, product_code, product_units, store_id)
VALUES (200015, '2021-10-15 10:11:01', 'ABC0003', 1, 123);
-- перезапуск обработки операции по вставке записи
RETRY UPSERT INTO sales
(id, transaction_date, product_code, product_units, store_id)
VALUES (200015, '2021-10-15 10:11:01', 'ABC0003', 1, 123);
-- удаление записей логической таблицы sales о покупках в магазине
DELETE FROM sales WHERE store_id = 456;
-- перезапуск обработки операции по удалению записей
RETRY DELETE FROM sales WHERE store_id = 456;
-- закрытие дельты
COMMIT DELTA;