Обновление данных
Содержание раздела
Система позволяет обновлять небольшие объемы данных: добавлять новые записи, изменять и удалять текущие записи.
Можно обновлять данные логических таблиц и standalone-таблиц. Обновление данных в логических и материализованных представлениях недоступно.
Под небольшим объемом данных подразумеваются десятки записей. Чтобы обновить большой объем данных, используйте загрузку данных.
Обновление данных логической таблицы
Чтобы обновить данные логической таблицы, выполните запрос на обновление данных:
- INSERT VALUES, INSERT SELECT или UPSERT VALUES — чтобы добавить новые или изменить существующие данные;
- DELETE — чтобы удалить данные.
Обновление данных можно включить в дельту. Чтобы обновить данные в дельте:
- Откройте дельту.
- Обновите нужные данные.
- Закройте дельту.
Чтобы данные, записанные вне дельт, были доступны во всех видах запросов на чтение и выгрузку данных, их должна замыкать дельта. При этом дельта может быть пустой. Подробнее см. в разделе Операции в дельте и вне дельты.
Обновление данных standalone-таблицы
Чтобы обновить данные standalone-таблицы:
- Создайте внешнюю writable-таблицу, если она отсутствует:
- если standalone-таблица отсутствует и ее нужно создать при создании внешней таблицы, укажите ключевое слово
OPTIONS
со значениемauto.create.table.enable=true
, - иначе пропустите ключевое слово
OPTIONS
или укажите для него значениеauto.create.table.enable=false
.
- если standalone-таблица отсутствует и ее нужно создать при создании внешней таблицы, укажите ключевое слово
- Выполните запрос на обновление данных:
- INSERT VALUES, INSERT SELECT или UPSERT VALUES — чтобы добавить новые или изменить существующие записи;
- DELETE — чтобы удалить записи.
При обновлении данных standalone-таблицы учитывайте ограничения таблиц в конкретной СУБД.
Примеры
Обновление данных логических таблиц
-- выбор логической базы данных marketing в качестве базы данных по умолчанию
USE marketing;
-- создание логической таблицы sales_july_2021, которая будет содержать данные о продажах за июль 2021 и размещаться в датасорсе adb
CREATE TABLE sales_july_2021 (
id INT NOT NULL,
transaction_date TIMESTAMP NOT NULL,
product_code VARCHAR(256) NOT NULL,
product_units INT NOT NULL,
store_id INT 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;
Обновление данных 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-таблицы в датасорсе adqm
CREATE WRITABLE EXTERNAL TABLE marketing.sales_ext_write_adqm (
id INT NOT NULL,
transaction_date TIMESTAMP NOT NULL,
product_code VARCHAR(256) NOT NULL,
product_units INT NOT NULL,
store_id INT NOT NULL,
description VARCHAR(256),
PRIMARY KEY (id)
)
DISTRIBUTED BY (id)
LOCATION 'core:adqm://dtm__marketing.sales'
OPTIONS ('auto.create.table.enable=true');
-- вставка данных из логической таблицы sales в standalone-таблицу, на которую указывает внешняя writable-таблица sales_ext_write_adqm
INSERT INTO marketing.sales_ext_write_adqm SELECT * FROM marketing.sales DATASOURCE_TYPE = 'adqm';
Перезапуск операций по обновлению данных
-- выбор логической базы данных 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;