2016-06-15 23 views
2

我有大量要同時插入PostgreSQL數據庫的行。我需要跟蹤爲每個插入的行分配了什麼id。比如講我們有表:如何從INSERT和其他插入的行中返回值

CREATE TABLE example 
(
    id serial, 
    name text, 
    CONSTRAINT example_pkey PRIMARY KEY (id), 
); 

現在我有,我不想插入(如序列ID列將分配一個新的ID)IDS的一些數據,但我需要跟蹤的映射之間舊的標識,新標識:

old id | name 
------------- 
-1  | foo 
-2  | bar 
-3  | baz 

所以我寫了這個查詢

WITH data(oldid,name) AS (VALUES 
    (-1,'foo'), 
    (-2,'bar'), 
    (-3,'baz') 
) 
INSERT INTO example(name) 
SELECT name FROM data d 
RETURNING id, d.oldid 

期待得到的東西回來就好:

id | oldid 
----------- 
1 | -1 
2 | -2 
3 | -3 

但是,這不起作用,因爲我不相信你可以返回一個未插入的列。有沒有其他方法可以做到這一點?

+0

我認爲最簡單的方法是將'oldid'列添加到您的示例表 – cha

+0

我認爲'RETURNING'與插入創建的行一起工作 - 所以我不能引用其他集的列 –

回答

1

我結束了創建一個函數,裹單個行的插入:

CREATE OR REPLACE FUNCTION add_example(
    in_name text) 
    RETURNS integer AS 
$BODY$ 
DECLARE 
new_id integer; 
BEGIN 
    INSERT INTO example(name) 
    VALUES (in_name) RETURNING id INTO new_id; 
    RETURN new_id; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

那麼我就可以這樣做:

WITH data(oldid, name) AS (VALUES 
    (-1,'foo'), 
    (-2,'bar'), 
    (-3,'baz') 
) 
SELECT oldid, add_example(name) AS id 
FROM data 

它返回我的期望。我想看看如果沒有這個功能可以完成。

0
CREATE SEQUENCE data_id_seq; 

CREATE TABLE DATA (
     id integer default nextval('data_id_seq') NOT NULL PRIMARY KEY, 
     oldid integer, 
     name text, 
); 

INSERT INTO DATA(oldid,name) values (-1,'foo'),(-2,'bar'),(-3,'baz') returning id,oldid; 
+0

表插入到沒有'oldid'列,有沒有可能不改變表? – dtkaias

+0

當您插入值時,您將創建一個新行。如果您想獲取舊值,則需要使用update語句或update和select的組合 – dmitryro

0

可選RETURNING子句使INSERT基於實際從https://www.postgresql.org/docs/current/static/sql-insert.html

所以柱寄生蟲插入

每一行計算並返回 值(一個或多個)是不可避免的對這樣的解決方案:

alter table example add column old bigint; 

WITH d(oldid,name) AS (VALUES 
    (-1,'foo'), 
    (-2,'bar'), 
    (-3,'baz') 
) 
INSERT INTO example(name,old) 
SELECT "name", oldid FROM d 
RETURNING id, old 
相關問題