Обновление данных
Содержание раздела
Система позволяет обновлять небольшие объемы данных: добавлять новые записи, изменять и удалять текущие записи.
Можно обновлять данные логических таблиц и standalone-таблиц. Обновление данных в логических и материализованных представлениях недоступно.
Под небольшим объемом данных подразумеваются десятки записей. Для обновления большого объема данных следует использовать загрузку данных.
Обновление данных поддерживается в ADB, ADQM и ADP.
Обновление данных логической таблицы
Чтобы обновить данные логической таблицы:
- Создайте логическую таблицу, если она еще не создана.
- Выполните запрос BEGIN DELTA на открытие дельты, если она еще не открыта.
- Выполните запрос на обновление данных:
- INSERT VALUES, INSERT SELECT или UPSERT VALUES — для добавления новых или изменения существующих данных;
- DELETE — для удаления данных.
- Если необходимо, обновите или загрузите другие данные.
В открытой дельте можно выполнять множество запросов на обновление и загрузку данных. При этом в каждую логическую таблицу в одной дельте можно добавлять записи с разными значениями первичного ключа или полные дубликаты. - Выполните запрос COMMIT DELTA для сохранения изменений и закрытия дельты.
При успешном выполнении действий состояние данных в логических таблицах обновляется, как описано в разделе Версионирование данных.
Пока дельта не закрыта, внесенные изменения можно отменить запросом ROLLBACK DELTA.
Незавершенную операцию по обновлению данных можно перезапустить, повторив исходный запрос с ключевым словом RETRY
(см. примеры ниже). Подробнее обо всех способах обработки незавершенных операций см. в разделе Управление операциями записи.
Обновление данных standalone-таблицы
Чтобы обновить данные в standalone-таблице:
- Создайте внешнюю writable-таблицу, указывающую на нужную standalone-таблицу, если writable-таблица еще не создана.
- Выполните запрос на обновление данных:
- INSERT VALUES, INSERT SELECT или UPSERT VALUES — для добавления новых или изменения существующих данных;
- DELETE — для удаления данных.
При обновлении данных в standalone-таблице нужно учитывать ограничения таблицы в конкретной СУБД.
Примеры
Обновление данных в логических таблицах
-- выбор логической базы данных marketing в качестве базы данных по умолчанию
USE marketing;
-- открытие новой (горячей) дельты
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_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 в новую таблицу 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';
Перезапуск операций по вставке и удалению записей
-- выбор логической базы данных sales в качестве базы данных по умолчанию
USE marketing;
-- открытие новой (горячей) дельты
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;