PostgreSQL 9.6中如何在同查询后续使用RETURNING返回值?
你的PostgreSQL写法完全可行!
嘿,这个写法是完全没问题的,PostgreSQL的CTE(公用表表达式)就是专门用来实现这类需求的——把INSERT操作的返回结果临时存储,供同一条SQL里的后续查询环节使用。
为什么这个写法能 work?
- 首先,CTE
new_track会优先执行里面的INSERT语句,把数据插入到eco.tracks表中,然后通过RETURNING track把插入后生成/存在的track字段值返回,并存为临时的CTE数据集。 - 之后主查询就可以直接引用这个
new_track数据集,用它来过滤eco.new_tracks表的记录,逻辑完全通顺。
需要注意的几个细节
确认
track字段存在且可返回
要确保eco.tracks表确实包含track字段,而且这条INSERT语句执行后,track字段有有效值可以返回——比如它是有默认值的字段、自增字段,或者你在INSERT里显式指定了它的值。如果track不存在,PostgreSQL会直接报错。处理多条返回记录的情况
如果你的INSERT操作可能返回多条记录(比如用INSERT ... SELECT批量插入),那主查询里的=就会触发错误(因为子查询返回了多行)。这时候推荐用JOIN来替代子查询,写法更安全:WITH new_track AS ( INSERT INTO eco.tracks (id, first_time, last_time) VALUES ('71C055', '2018/04/10', '2018/04/10') RETURNING track ) SELECT nt.* FROM eco.new_tracks nt INNER JOIN new_track ntc ON nt.track = ntc.track;PostgreSQL 9.6的兼容性
你用的9.6版本对这种CTE+INSERT RETURNING的写法支持很完善,完全不用担心版本兼容问题,放心用就好。
内容的提问来源于stack exchange,提问作者Nik Konst
相关产品推荐
相关产品推荐

