代码之家  ›  专栏  ›  技术社区  ›  Dusty

返回PostgreSQL中的插入行

  •  13
  • Dusty  · 技术社区  · 15 年前

    我目前正在研究一个报表生成servlet,它将多个表中的信息聚合在一起并生成一个报表。除了返回结果行之外,我还将它们存储到一个报表表中,这样以后就不需要重新生成它们了,而且如果清除了从中提取的表,它们也将保持不变。为了实现后者,我有一个形式的语句(nb: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 回复  |  直到 8 年前
        1
  •  23
  •   Matthew Wood    15 年前

    在版本为>=8.2的PostgreSQL中,可以使用以下构造:

    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
    
        2
  •  8
  •   dman    8 年前

    或不选择:

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

    documentation

        3
  •  4
  •   Joshua D. Drake    15 年前

    您也可以使用一个SRF,尽管这可能是过度杀伤力。这取决于你想做什么。例如,如果您只返回信息来执行将直接返回数据库以执行更多查询的一段逻辑,那么使用SRF可能是有意义的。

    http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions