INSERT...RETURNING仅首次插入返回结果是否为该语句的预期行为?
结论
这是INSERT ... ON CONFLICT DO NOTHING RETURNING语句的预期正常行为。
核心逻辑
RETURNING子句仅会返回当前SQL语句实际成功写入/修改的行,如果语句执行过程中没有任何行被新增或变更,就不会有返回结果。- 第二次执行语句时,
mrn和name列的唯一约束命中冲突,触发了你设置的ON CONFLICT DO NOTHING逻辑,没有新行被插入到表中,因此不会返回id字段,同时也不会抛出冲突报错。
适配写法
如果需要无论插入新行还是命中已有行,都能拿到对应记录的id值,可以调整为无实际变更的ON CONFLICT DO UPDATE写法:
INSERT INTO identities (mrn, name) VALUES('x', 'y') ON CONFLICT (mrn, name) DO UPDATE SET mrn = EXCLUDED.mrn RETURNING id;
上面的DO UPDATE是无业务逻辑的空更新,不会修改已有数据,但可以触发RETURNING返回已有行的id。
内容的提问来源于stack exchange,提问作者ka3ak
相关产品推荐
相关产品推荐

