Я читал о различных UPSERT
реализациях в PostgreSQL, но все эти решения относительно старые или относительно экзотические (например, с использованием записываемого CTE ).
И я просто не являюсь экспертом в psql, чтобы сразу выяснить, устарели ли эти решения, потому что они хорошо рекомендованы, или они (ну, почти все они) являются просто игрушечными примерами, не подходящими для промышленного использования.
Какой самый потокобезопасный способ реализовать UPSERT в PostgreSQL?
postgresql
plpgsql
upsert
shabunc
источник
источник
ОБНОВЛЕНИЕ (2015-08-20):
В настоящее время существует официальная реализация для обработки upserts посредством использования
ON CONFLICT DO UPDATE
(официальная документация). На момент написания этой статьи эта функция в настоящее время находится в PostgreSQL 9.5 Alpha 2, который доступен для загрузки здесь: Исходные каталоги Postgres .Вот пример, если предположить, что
item_id
ваш первичный ключ:Оригинальный пост ...
Вот реализация, к которой я пришел, когда хотел получить представление о том, произошла вставка или обновление.
Определение
upsert_data
состоит в том, чтобы объединить значения в один ресурс, вместо того, чтобы указывать цену и item_id дважды: один раз для обновления, снова для вставки.Если вам не нравится использование
upsert_data
, вот альтернативная реализация:источник
Это позволит вам узнать, произошла ли вставка или обновление:
Если обновление произойдет, вы получите вставку 0, иначе вставка 1 или ошибка.
источник