Что такое UPSERT (INSERT ... ON CONFLICT)?

UPSERT — это операция, которая делает INSERT, а если возникает конфликт по уникальному ключу, обновляет существующую строку через ON CONFLICT. В PostgreSQL это удобный способ безопасно вставлять или обновлять данные одной командой.
Подробный ответ

Что такое UPSERT

UPSERT — это сочетание INSERT и UPDATE. Если строки ещё нет, она вставляется, а если конфликтует уникальный ключ, существующая строка обновляется.

Как это выглядит в PostgreSQL

INSERT INTO users (id, email, name)
VALUES (1, 'test@example.com', 'Test')
ON CONFLICT (id)
DO UPDATE SET
  email = EXCLUDED.email,
  name = EXCLUDED.name;

Здесь, если id уже существует, данные обновятся вместо ошибки.

Когда использовать

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

Что важно помнить

  • нужно, чтобы был уникальный индекс или PRIMARY KEY;

  • надо понимать, какие поля обновляются при конфликте;

  • возможны гонки, если логика сложная, поэтому иногда требуется транзакция или дополнительная проверка.

Как ответить на собеседовании

UPSERT — это запись вида INSERT ... ON CONFLICT, которая вставляет строку или обновляет её при конфликте уникального ключа. Это удобно, когда нужна идемпотентная запись без отдельного SELECT перед INSERT.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге