我已经阅读了UPSERT
PostgreSQL 中的不同实现,但所有这些解决方案都相对较旧或相对陌生(例如,使用可写 CTE)。
而且我根本不是 psql 专家,无法立即找出这些解决方案是否过时,因为它们受到了很好的推荐,或者它们(嗯,几乎所有这些都是)只是不适合生产使用的玩具示例。
在 PostgreSQL 中实现 UPSERT 的最线程安全的方法是什么?
我已经阅读了UPSERT
PostgreSQL 中的不同实现,但所有这些解决方案都相对较旧或相对陌生(例如,使用可写 CTE)。
而且我根本不是 psql 专家,无法立即找出这些解决方案是否过时,因为它们受到了很好的推荐,或者它们(嗯,几乎所有这些都是)只是不适合生产使用的玩具示例。
在 PostgreSQL 中实现 UPSERT 的最线程安全的方法是什么?
更新(2015-08-20):
现在有一个通过使用
ON CONFLICT DO UPDATE
(官方文档)来处理 upsert 的官方实现。在撰写本文时,此功能当前位于 PostgreSQL 9.5 Alpha 2 中,可在此处下载:Postgres 源目录。这是一个示例,假设
item_id
是您的主键:原帖...
这是我在希望了解是否发生插入或更新时遇到的一个实现。
的定义
upsert_data
是将值合并到单个资源中,而不是必须指定 price 和 item_id 两次:一次用于更新,再次用于插入。如果您不喜欢使用
upsert_data
,这里有一个替代实现:PostgreSQL 现在有UPSERT。
根据类似 StackOverflow 问题的首选方法目前如下:
这将让您知道插入或更新是否发生:
如果发生更新,您将得到一个插入 0,否则插入 1 或错误。