Обработка конфликтов при вставке данных с UPSERT
В PostgreSQL команда UPSERT реализована с помощью конструкции INSERT ... ON CONFLICT
, которая позволяет обрабатывать конфликты, возникающие при вставке данных. Это позволяет либо обновлять существующие записи, либо выполнять другие действия при возникновении конфликта.
Синтаксис INSERT ... ON CONFLICT
INSERT ... ON CONFLICT
Обработка конфликтов
Указание уникального ключа
Конфликт возникает, если в таблице уже существует запись с таким же значением уникального ключа. Уникальный ключ может быть первичным ключом или уникальным индексом.
Если запись с
employee_id = 1
уже существует, она будет обновлена значениями изEXCLUDED
, то есть новыми значениями дляname
иsalary
.Если записи с таким
employee_id
нет, она будет вставлена.
Обновление с условиями
Вы можете использовать условные выражения в части DO UPDATE
для более сложной логики обновления.
Обновление
salary
произойдет только если новое значение больше текущего значения.name
будет обновлено всегда.
Обновление и выполнение действий в случае конфликта
Вы можете использовать DO NOTHING
для пропуска вставки в случае конфликта.
Если запись с
employee_id = 1
уже существует, вставка будет пропущена, и никаких изменений не будет.
Обработка нескольких уникальных ключей
Если у вас есть несколько уникальных ключей, можно указать один из них для обработки конфликта, но для сложных сценариев может потребоваться использование нескольких команд INSERT ... ON CONFLICT
или других подходов.
Обработка конфликта будет сначала по
employee_id
, а затем, если конфликт поemployee_id
не возникнет, проверяетсяemail
.
Пример с более сложными действиями
В этом примере происходит обновление записи только если новое значение salary
больше старого и вставка новой записи, если конфликт не возник.
Если запись с
employee_id
существует, она будет обновлена в зависимости от значенияsalary
.Если запись с таким
employee_id
отсутствует, она будет вставлена.
Особенности
EXCLUDED: Ключевое слово
EXCLUDED
используется для ссылки на значения, которые пытались вставить, но возник конфликт. Это позволяет использовать эти значения в выражениях для обновления.Производительность:
INSERT ... ON CONFLICT
обычно более эффективен, чем отдельные командыINSERT
иUPDATE
, так как объединяет логику в одном запросе.Ограничения: Команда работает только с уникальными ключами и первичными ключами. Она не может обрабатывать конфликты по неуникальным индексам напрямую.
Команда INSERT ... ON CONFLICT
в PostgreSQL предоставляет гибкий и мощный способ для обработки конфликтов при вставке данных, позволяя эффективно управлять уникальными записями и выполнять различные действия в зависимости от ситуации.
Last updated