Insert or update. Upsert

Версия 2.8 от Alexandr Fokin на 2024/06/01 12:59
Предупреждение: Из соображений безопасности документ отображается в ограниченном режиме, поскольку это не текущая версия. Из-за этого могут быть расхождения и ошибки.

 insert on conflict 
If not existINSERT INTO table1
    (id)
SELECT 1
WHERE
   NOT EXISTS (
       SELECT 1
       FROM table1
       WHERE id = 1
    )
ON CONFLICT DO NOTHING

Конструкция 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

   

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

Дочерние страницы:
Обратные ссылки:

Не удалось выполнить макрос [velocity]. Причина: [The execution of the [velocity] script macro is not allowed in [xwiki:Разработка.Базы данных.SQL.PostgreSQL.Сценарии.Insert or update\. Upsert.WebHome]. Check the rights of its last author or the parameters if it's rendered from another script.]. Нажмите на это сообщение для получения подробной информации.