UPSERT INTO

UPSERT (расшифровывается как UPDATE or INSERT) обновляет или добавляет множество строк в таблице на основании сравнения по первичному ключу. Отсутствующие строки добавляются. В присутствующих строках обновляются значения заданных столбцов, значения остальных столбцов остаются неизменными.

Таблица по имени ищется в базе данных, заданной оператором USE.

UPSERT является единственной операцией модификации данных, которая не требует их предварительного чтения, за счет чего работает быстрее и дешевле других операций.

Сопоставление столбцов при использовании UPSERT INTO ... SELECT производится по именам. Используйте AS для получения колонки с нужным именем в SELECT.

Примеры

UPSERT INTO my_table
SELECT pk_column, data_column1, col24 as data_column3 FROM other_table  
UPSERT INTO my_table ( pk_column1, pk_column2, data_column2, data_column5 )
VALUES ( 1, 10, 'Some text', Date('2021-10-07')),
       ( 2, 10, 'Some text', Date('2021-10-08'))

UPSERT в YTsaurus

Внимание

В самом YTsaurus операция не поддерживается, однако она может быть использована для публикации данных в Статфейс.

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

Примеры:

UPSERT INTO stat.`Adhoc/My/Report/daily`
SELECT fielddate, hits FROM my_table_source;
UPSERT INTO
  stat_beta.`Adhoc/My/Report/daily` (fielddate, hits)
VALUES
  ("2018-09-01", 1),
  ("2018-09-02", 2);

Внимание

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

Удаление данных из отчета перед заливкой

По умолчанию операция UPSERT INTO точечно обновляет записи в отчете в соответствии с набором измерений отчета.

Также поддерживается возможность удаления из отчета перед заливкой всех записей, значения некоторого набора измерений которых встречаются в заливаемых данных; для этого достаточно добавить модификатор: UPSERT INTO ... ERASE BY (A, B, C), где A, B, C задают требуемый набор измерений.

Примеры:

UPSERT INTO stat.`Adhoc/My/Report/daily` ERASE BY (fielddate)
SELECT fielddate, country, hits FROM my_table_source;

В этом примере из отчета будут удалены все данные за вновь посчитанные дни расчета (поле fielddate для скейла daily содержит дни), после чего будут залиты посчитанные данные.

UPSERT INTO stat.`Adhoc/My/Report/daily` ERASE BY (fielddate, country)
SELECT fielddate, country, hits FROM my_table_source;

В этом случае задан полный набор измерений отчета, поэтому поведение семантически ничем не отличается от дефолтного поведения операции UPSERT INTO, модификатор можно не указывать.