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

Система позволяет обновлять небольшие объемы данных, добавляя новые и архивируя устаревшие данные. Обновлять данные можно только в логических таблицах. Обновление данных в логических и материализованных представлениях недоступно.

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

Обновление данных в ADG не поддерживается.

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

  1. Создайте логическую таблицу, если она еще не создана.
  2. Выполните запрос BEGIN DELTA на открытие дельты, если она еще не открыта.
  3. Выполните запрос на обновление данных:
    • UPSERT VALUES или UPSERT SELECT — для добавления новых или изменения актуальных данных;
    • DELETE — для архивации актуальных данных.
  4. Если необходимо, обновите или загрузите другие данные.
    В открытой дельте можно выполнить произвольное количество запросов на обновление и загрузку данных, а также отменить изменения. При этом не допускается загрузка различных состояний объекта (то есть различных записей с одинаковым первичным ключом) в одной дельте.
  5. Выполните запрос COMMIT DELTA для сохранения изменений и закрытия дельты.

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

Пока дельта не закрыта, изменения по всем ее завершенным операциям записи можно отменить с помощью запроса ROLLBACK DELTA. Изменения по незавершенным операциям отменить невозможно.

Примеры

-- выбор логической базы данных sales в качестве базы данных по умолчанию
USE sales;

-- открытие новой (горячей) дельты
BEGIN DELTA;

-- вставка трех записей в логическую таблицу sales
UPSERT 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 
UPSERT 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;