Обновление данных

Содержание раздела
  1. Обновление данных логической таблицы
  2. Обновление данных standalone-таблицы
  3. Примеры
    1. Обновление данных логических таблиц
    2. Обновление данных standalone-таблиц
    3. Перезапуск операций по обновлению данных

Система позволяет обновлять небольшие объемы данных: добавлять новые записи, изменять и удалять текущие записи.

Можно обновлять данные логических таблиц и standalone-таблиц. Обновление данных в логических и материализованных представлениях недоступно.

Под небольшим объемом данных подразумеваются десятки записей. Чтобы обновить большой объем данных, используйте загрузку данных.

Обновление данных логической таблицы

Чтобы обновить данные логической таблицы, выполните запрос на обновление данных:

Обновление данных можно включить в дельту. Чтобы обновить данные в дельте:

  1. Откройте дельту.
  2. Обновите нужные данные.
  3. Закройте дельту.

Чтобы данные, записанные вне дельт, были доступны во всех видах запросов на чтение и выгрузку данных, их должна замыкать дельта. При этом дельта может быть пустой. Подробнее см. в разделе Операции в дельте и вне дельты.

Обновление данных standalone-таблицы

Чтобы обновить данные standalone-таблицы:

  1. Создайте внешнюю writable-таблицу, если она отсутствует:
    • если standalone-таблица отсутствует и ее нужно создать при создании внешней таблицы, укажите ключевое слово OPTIONS со значением auto.create.table.enable=true,
    • иначе пропустите ключевое слово OPTIONS или укажите для него значение auto.create.table.enable=false.
  2. Выполните запрос на обновление данных:

При обновлении данных standalone-таблицы учитывайте ограничения таблиц в конкретной СУБД.

Примеры

Обновление данных логических таблиц

-- выбор логической базы данных 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;

Обновление данных 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;