Сценарии - Insert or update. Upsert

Page / - Изменено Alexandr Fokin в 2025/06/22 17:41

Insert or update. Upsert

Изменено Alexandr Fokin

в 2025/06/22 17:41

Оглавление

insert on conflict If not exist	INSERT INTO table1 (id) SELECT 1 WHERE NOT EXISTS ( SELECT 1 FROM table1 WHERE id = 1 -- for share ) ON CONFLICT DO NOTHING	Избыточная генерация PK. Конструкция ON CONFLICT не защищает от обращения к генератору ключа (sequence). И это может привести к тому, что счетчик будет крутиться впустую. Использование выборки с условием вроде не убирает полностью ложные срабатывания (если они проходя одновременно), но после вставки записи, обращения к генератору прекратятся. PostgreSQL Antipatterns: накручиваем себе проблемы https://habr.com/ru/companies/tensor/articles/507688/ Postgres: INSERT if does not exist already https://stackoverflow.com/questions/4069718/postgres-insert-if-does-not-exist-already Взаимодействие с блокировками Поведение параллельных транзакций (Read Commited): Параллельные транзакции select for update update или delete Без where exists Не блокируется. Блокируется. С where exsists Не блокируется Не блокируется с where exsists и for share Блокируется Блокируется. Важно подчеркнуть, select for update не всегда блокирует insert on conflict do nothing (как показано в таблице). В некоторых случаях может потребоваться явное ручное обновление записи для блокировки, чтобы заблокировать параллельные вызовы upsert (чтобы они они дождались завершения текущей транзакции), причем в том числе возможно перед проверкой условий.
Merge	Не ждет блокировок.
WITH upsert

Внутренние ссылки:

Дочерние страницы:

Обратные ссылки:

Insert or update. Upsert