【问题标题】:SELECT * FROM NEW TABLE equivalent in PostgresSELECT * FROM NEW TABLE 在 Postgres 中等效
【发布时间】:2014-10-27 02:50:43
【问题描述】:

在 DB2 中,我可以执行如下所示的命令来从插入的行中检索信息:

SELECT *
FROM NEW TABLE (
    INSERT INTO phone_book
    VALUES ( 'Peter Doe','555-2323' )
) AS t

如何在 Postgres 中做到这一点?

有办法检索序列,但我需要检索任意列。

出于性能原因,我希望将选择与插入合并。这样我只需要执行一个语句来插入值并从插入中选择值。插入的值来自子选择而不是值子句。我只需要插入 1 行。

该示例代码来自Wikipedia Insert Article

【问题讨论】:

  • 不明白导致您尝试选择并插入一个命令的性能原因是什么。在我看来,您应该在选择之前提交插入操作的提交。
  • @ParisTao:单个命令(返回正确的行,包括自动生成的内容,如序列号)是最简单、最快且最安全的。可能还希望插入/更新更多行(如引用 ID 的其他表中的子行)提交所有数据之前(或什么都不提交)。

标签: sql postgresql sql-insert


【解决方案1】:

普通的 INSERT ... RETURNING ... 可以完成这项工作并提供最佳性能
不需要 CTE。

INSERT INTO phone_book (name, number)
VALUES ( 'Peter Doe','555-2323' )
RETURNING *  -- or just phonebook_id, if that's all you need

旁白:在大多数情况下,建议添加目标列表。

Wikipedia page you quoted 已经有相同的建议:

对 PostgreSQL 使用带有 RETURNING 子句的 INSERT 语句(因为 8.2)。返回的列表与 SELECT 的结果相同。

【讨论】:

    【解决方案2】:

    PostgreSQL 通过公用表表达式中的returning 子句支持这种行为。您通常不应该仅仅因为执行一条语句而不是两条语句就认为这样的事情会提高性能。 Use EXPLAIN 来衡量性能。

    create table test (
      test_id serial primary key,
      col1 integer
    );
    
    with inserted_rows as (
      insert into test (c1) values (3)
      returning *
    )
    select * from inserted_rows;
    
    test_id col1 -- 1 3

    Docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2011-04-06
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      相关资源
      最近更新 更多