我知道 Postgres 没有提供专门的 upsert 方法,但是提供了等效的方法:on conflict
。
但是,在冲突发生的时候,如果没有修改该记录,reuturning
是没有记录返回的。下面的操作记录,第一次插入没有冲突,有记录插入,返回了记录的 id ;第二次插入的时候冲突,没有修改记录,所以没有返回任何记录。
create table mytab(id serial primary key, name text unique);
dbtests=$ insert into mytab(name) values('aaron') on conflict(name) do nothing returning id;
id
----
1
(1 row)
INSERT 0 1
dbtests=$ insert into mytab(name) values('aaron') on conflict(name) do nothing returning id;
id
----
(0 rows)
INSERT 0 0
发现如果冲突后,强制将 mytab.id 刷新一下,又造成了写负担;如果 union 查询一下,又造成了读负担。 难道没有一个可以没有额外开销的语句么?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.