UPSERT VALUES

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

Запрос позволяет вставить новые записи и обновить существующие записи в логической таблице.

Существование записи в таблице определяется по значению первичного ключа. Если в таблице существует запись со значением первичного ключа, указанным в запросе, то запись обновляется значениями из запроса. Иначе, если запись отсутствует, то добавляется новая запись со значениями из запроса, а пропущенные поля заполняются значениями по умолчанию.

Запрос поддерживается для ADB и ADP.

В отличие от INSERT VALUES, запрос UPSERT VALUES обновляет существующую запись только теми значениями, которые указаны в запросе. Для полного обновления существующих записей следует использовать запрос INSERT VALUES.
Для обновления большого объема данных следует использовать загрузку данных.

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

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

  • пустой объект 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.
  • Не допускается выполнение идентичных параллельных запросов.

Пример

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

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

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

-- вставка трех записей в логическую таблицу sales
UPSERT INTO sales 
VALUES (200011, '2021-08-21 23:34:10', 'ABC0001', 2, 123, 'Покупка по акции "1+1"'), 
       (200012, '2021-08-22 10:05:56', 'ABC0001', 1, 234, 'Покупка без акций'), 
       (200013, '2021-08-22 13:17:47', 'ABC0002', 4, 123, 'Покупка по акции "Лето"');

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

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

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

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

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

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