【发布时间】:2011-06-21 13:12:10
【问题描述】:
这个问题是关于单行的,而不是一组。我只是好奇使用最新最好的 Pg (9.0) 版本更快,以及为什么:
基于 PKEY 上的 SELECT 的条件 UPDATE 或 INSERT
尝试插入,在失败时捕获异常并回退到更新
尝试更新,在失败时捕获异常并回退到插入
我认为因为这取决于数据集,所以我们假设三种情况:
- 50% 的行存在,50% 不存在
- 存在 100% 的行
- 100% 的行不存在
Presence 表示 PKEY 已满足并且应该更新该行。任何有关这方面研究的链接都会很棒。
【问题讨论】:
-
MERGE 是 ANSI-2003 语法:wiki.postgresql.org/wiki/SQL_MERGE
-
MERGE 还没有在 Postgresql 中。
-
RhodiumToad 补充说选项 1 具有隐式竞争条件,并且没有不涉及异常处理的解决方案。
-
其实他们都有竞争条件。如果您采用其中任何一种方法,并在两个不同的窗口中一次运行一行,您的 upserts 中可能会出现错误。
-
第一个“基于 PKEY 上的 SELECT 的条件 UPDATE 或 INSERT”是一种执行 upsert 的无效方式。 @ScottMarlowe:如果在事务中完成,最后两个很好(有一些额外的逻辑涉及 while 循环以避免死锁)。
标签: sql postgresql merge upsert