我知道 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 查询一下,又造成了读负担。 难道没有一个可以没有额外开销的语句么?