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