Вставка и обновление данных

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

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

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

Предварительный шаг для standalone-таблиц

Вставка и обновление данных в standalone-таблице выполняется с помощью внешней writable-таблицы. Если она отсутствует, ее необходимо создать.

Чтобы создать внешнюю writable-таблицу, выполните запрос CREATE WRITABLE EXTERNAL TABLE:

  • если standalone-таблица отсутствует и ее нужно создать при создании внешней таблицы, укажите в запросе ключевое слово OPTIONS со значением auto.create.table.enable=true;
  • иначе выполните запрос без ключевого слова OPTIONS.

Как вставить или обновить данные

Чтобы вставить или обновить данные:

  1. Если необходимо включить изменения данных логической таблицы в дельту и в логической БД нет открытой дельты, откройте новую дельту.
  2. Выполните запрос INSERT VALUES или UPSERT VALUES:
    • чтобы выполнить запрос в синхронном режиме, используйте любой из способов:
      • отправьте запрос по JDBC,
      • отправьте запрос по HTTP с помощью POST-метода query без параметра async или с параметром async, имеющим значение false;
    • чтобы выполнить запрос в асинхронном режиме, отправьте его по HTTP с помощью POST-метода query с параметром async, имеющим значение true.
  3. Если изменения были выполнены в дельте и они должны быть последними в дельте, закройте дельту.

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

Запрос UPSERT VALUES недоступен для standalone-таблицы, если связанная с ней writable-таблица не имеет первичного ключа.

Примеры

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

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

-- вставка/обновление двух записей логической таблицы 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, 'Покупка по акции "Лето"');

-- закрытие дельты
COMMIT DELTA;

Вставка и обновление данных прокси-таблиц

-- вставка/обновление трех записей прокси-таблицы
INSERT INTO marketing.payments_proxy 
VALUES (100, 111111, 'AC', 12002.53, 'RUB', 'Номер чека 12345'),
       (101, 222222, 'AG', 450.00, 'RUB', 'Номер чека 4583'),
       (102, 333333, 'AG', 2630.30, 'RUB', 'Номер чека 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', 'Договор с ООО "Круг"')

Перезапуск операций по вставке и обновлению данных

-- выбор логической базы данных marketing_new в качестве базы данных по умолчанию
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);

-- закрытие дельты
COMMIT DELTA;

Причины ошибок при вставке и обновлении данных

Ошибки при вставке и обновлении данных могут быть вызваны следующими основными причинами:

  • Несоответствие порядка, количества или типов столбцов между запросом и таблицей-приемником данных.
  • Отсутствие в запросе значений обязательных столбцов таблицы-приемника данных.

Отмена неуспешной операции

При неуспешном обновлении и вставке данных в логическую таблицу система отменяет соответствующую операцию записи и возвращает данные в состояние, предшествовавшее этой операции.

При неуспешной вставке данных в standalone-таблицу изменения не отменяются автоматически, — их нужно отменять вручную в соответствующем датасорсе. Если ошибка связана с ограничениями целевой СУБД, для устранения такой ошибки следуйте рекомендациям, доступным в документации этой СУБД.