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
, модификатор можно не указывать.