在Postgres中SELECT * FROM NEW TABLE等价物

时间:2014-10-27 02:50:43

标签: sql postgresql sql-insert

在DB2中,我可以执行一个看起来像这样的命令来从插入的行中检索信息:

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

我如何在Postgres中做到这一点?

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

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

示例代码已从Wikipedia Insert Article

取消

2 个答案:

答案 0 :(得分:6)

普通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的结果相同。

答案 1 :(得分: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