UPSERT VALUES
Содержание раздела
Запрос позволяет вставить новые записи и обновить существующие записи в логической таблице.
Существование записи в таблице определяется по значению первичного ключа. Если в таблице существует запись со значением первичного ключа, указанным в запросе, то запись обновляется значениями из запроса. Иначе, если запись отсутствует, то добавляется новая запись со значениями из запроса, а пропущенные поля заполняются значениями по умолчанию.
Запрос поддерживается для 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;