2014-10-27 73 views
2

在DB2我能做的,看起來像這樣從插入行獲取信息的命令:SELECT * FROM NEW TABLE等同於Postgres的

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

我該怎麼做,在Postgres的?

有辦法檢索一個序列,但我需要檢索任意列。

我希望合併選擇插入是出於性能的原因。這樣我只需要執行一條語句來插入值並從插入中選擇值。插入的值來自子查詢而不是值子句。我只需要插入1行。

即樣本代碼從Wikipedia Insert Article

+0

不明白導致您嘗試選擇並插入到一個命令中的性能原因。在我看來,你應該在選擇之前提交提交插入操作。 – 2014-10-27 03:23:20

+0

@ParisTao:一條命令(返回正確的行,包括像串行ID這樣的自動生成的內容)是最簡單,最快和最安全的*。有人可能還希望在提交所有內容(或不提供任何內容)之前插入/更新更多行(如引用該ID的其他表中的子行)。 – 2014-10-27 03:57:29

回答

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已經有相同的意見:

使用INSERT語句與返回的條款對PostgreSQL(自 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

相關問題