Link Search Menu Expand Document

UPSERT VALUES

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

Запрос позволяет вставить несколько записей в логическую таблицу
добавить информацию о новых объектах и (или) обновить информацию о существующих объектах. Запрос обрабатывается в порядке, описанном в разделе Порядок обработки запросов на обновление данных.

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

Запрос не поддерживается для ADG.

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

В ответе возвращается:

  • пустой объект ResultSet при успешном выполнении запроса;
  • исключение при неуспешном выполнении запроса.

При успешном выполнении запроса данные вставляются в СУБД хранилища, в которых размещены данные указанной логической таблицы. Каждая из вставленных записей сохраняется как актуальная запись таблицы, а предыдущая актуальная запись, если такая найдена, становится архивной. Наличие предыдущей актуальной записи определяется по первичному ключу: все записи таблицы с одинаковым первичным ключом рассматриваются системой как различные исторические состояния одного объекта. Подробнее о версионировании см. в разделе Версионирование данных.

Месторасположение данных таблицы можно задавать запросами CREATE TABLE и DROP TABLE с указанием ключевого слова DATASOURCE_TYPE.

Если операция записи, запущенная запросом UPSERT VALUES, зависла, горячую дельту невозможно закрыть или откатить. В этом случае нужно повторить запрос. Действие перезапустит обработку операции, и после ее завершения можно будет закрыть или откатить дельту. Список незавершенных (в том числе — зависших) операций можно посмотреть можно с помощью запроса GET_WRITE_OPERATIONS.

Синтаксис

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

UPSERT INTO [db_name.]table_name VALUES (value_list_1), (value_list_2), ...

Вставка данных только в некоторые столбцы логической таблицы (с заполнением остальных столбцов значениями, которые определены в СУБД хранилища как значения по умолчанию):

UPSERT INTO [db_name.]table_name (column_list) VALUES (value_list_1), (value_list_2), ...

Параметры:

  • db_name — имя логической базы данных. Опционально, если выбрана логическая БД, используемая по умолчанию;
  • table_name — имя логической таблицы, в которую вставляются данные;
  • column_list — список имен столбцов логической таблицы. Имена указываются в круглых скобках через запятую. Список опционален, если количество и порядок вставляемых значений (в списке value_list_N) соответствуют количеству и порядку столбцов в логической таблице;
  • value_list_N — список значений, вставляемых в столбцы логической таблицы. Значения указываются в круглых скобках через запятую. Каждый такой список — это строка, вставляемая в таблицу.

Ограничения

  • Выполнение запроса возможно только при наличии открытой дельты (см. BEGIN DELTA).
  • Столбцы в запросе не могут иметь имена, зарезервированные для служебного использования: sys_op, sys_from, sys_to, sys_close_date, bucket_id, sign.

Пример

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

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

-- закрытие дельты (фиксация изменений)
COMMIT DELTA;

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

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

-- вставка двух записей в логическую таблицу sales (без указания значения столбца description)
UPSERT INTO sales.sales 
       (id, transaction_date, product_code, product_units, store_id)
VALUES (100014, '2021-08-23 09:34:10', 'ABC0003', 3, 123), 
       (100012, '2021-08-23 20:05:56', 'ABC0001', 6, 234);

-- закрытие дельты (фиксация изменений)
COMMIT DELTA;