在PostgreSQL中返回插入的行

32

我目前正在开发一个报表生成servlet,它汇总了几个表中的信息并生成报表。除了返回结果行之外,我还将它们存储到一个报表表中,以便以后不需要重新生成,并且如果它们绘制的表被清除,它们也会持久存在。为此,我有一个形如下面的语句(注:x是外部生成的,在这个语句中实际上是一个常数):

INSERT INTO reports
   (report_id, col_a, col_b, col_c)
SELECT x as report_id, foo.a, bar.b, bar.c
FROM foo, bar

这个代码可以正常运行,但之后我需要进行第二个查询来实际返回结果行,例如:

SELECT col_a, col_b, col_c
FROM reports
WHERE report_id = x

这个方法运行良好,并且因为只涉及单个表,所以不应该很耗费资源,但似乎应该能够直接返回插入结果而避免第二个查询。是否有一些我没有找到的语法可以实现这个功能?(需要注意的是,我在数据库方面还比较新手,如果正确的答案是运行第二个查询,因为只稍微慢一点,那就运行第二个查询吧)

3个回答

60
在PostgreSQL 8.2及以上版本中,您可以使用以下语法结构:
INSERT INTO reports (report_id, col_a, col_b, col_c)
SELECT x as report_id, foo.a, bar.b, bar.c
FROM foo, bar
RETURNING col_a, col_b, col_c

1
+1 对于一个扎实的答案,并且提到版本要求(尽管现在大多数人应该至少使用8.3版本)。 - ChristopheD

24

或者不使用选择器:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

文档


29
我认为Op要求返回整行数据,这可以用RETURNING *;实现。 - BishopZ

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接