Что такое ON CONFLICT ... в SQL? Как это работает? Почему эту команду иногда называют UPSERT?
ON CONFLICT — это конструкция в SQL (в первую очередь в PostgreSQL), которая задаёт поведение при конфликте вставки по уникальному или первичному ключу. Она позволяет вместо ошибки либо проигнорировать конфликтующую строку, либо обновить существующую запись (реализовать «upsert»). Таким образом, INSERT ... ON CONFLICT сочетает вставку и обновление в одной операции.
ON CONFLICT используется в операторе INSERT и описывает, что делать, если вставляемая строка нарушает уникальное ограничение или первичный ключ. Вместо того чтобы получить ошибку duplicate key value violates unique constraint, мы можем явно указать желаемое поведение.
Общая форма в PostgreSQL:
Основные варианты поведения:
ON CONFLICT ... DO NOTHING — при конфликте строка просто не вставляется, но запрос не падает с ошибкой.ON CONFLICT ... DO UPDATE — при конфликте существующая строка обновляется по указанным правилам (классический upsert).Конфликт определяется либо по конкретным колонкам с уникальным ограничением, либо по имени самого ограничения. В DO UPDATE доступна псевдотаблица EXCLUDED, содержащая значения из попытки вставки; с её помощью можно комбинировать старые и новые значения.
Важно правильно выбирать конфликтующую колонку или ограничение: ON CONFLICT (id) сработает только если на id есть уникальный индекс или первичный ключ. Также стоит учитывать семантику: DO NOTHING подходит, когда нас устраивает сохранение старых данных, а DO UPDATE — когда мы хотим гарантированно актуализировать запись одной командой.
Отметьте свой прогресс