data-infra
Словарь ↗Upsert (вставка или обновление)
Upsert записывает строку, если её нет, и обновляет, если она есть, — одним оператором. Базы называют это по-разному: INSERT ... ON CONFLICT, MERGE, INSERT ... ON DUPLICATE KEY UPDATE, — но смысл один: сделать запись идемпотентной относительно ключа, чтобы повторение приводило к тому же конечному состоянию, а не к дубликату строки или ошибке. Именно поэтому upsert лежит в основании конвейеров данных и интеграций. Синхронизация, перечитывающая источник; потребитель вебхуков, который может получить одно событие дважды; пакетная задача, перезапущенная после частичного сбоя, — все они безопасны, если запись идёт по ключу и идемпотентна, и все они плодят дубликаты, если нет. Та же логика работает для ночной загрузки, намеренно перекрывающей предыдущее окно, — стандартный способ пережить опоздавшие записи. Поведение upsert определяют две детали. Нужен настоящий уникальный индекс по ключу конфликта: без него базе не с чем сверяться, а логика «проверить и вставить» на уровне приложения проигрывает гонку при конкурентности. И ветка обновления обязана явно перечислить перезаписываемые столбцы: слепая замена всех колонок затрёт поля, о которых источник не знает, — локально вычисленный статус или значение, которым владеет другая система. Массовые upsert дороже обычных вставок из-за обращений к индексам, поэтому объёмные загрузки иногда сначала складывают во временную таблицу и сливают один раз.
Похожие термины