2016-06-15 7 views
2

PostgreSQLデータベースに同時に挿入したい行がたくさんあります。私は挿入されている各行に対してどのidが割り当てられているかを追跡する必要があります。たとえば、私たちはテーブルを持っていると言う:挿入された行以外の値をINSERTから返す方法

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

は今、私は(シリアルID列が新しいIDを割り当てますよう)に挿入たくないIDを持ついくつかのデータを持っているが、私はとの間のマッピングを追跡する必要があります古いIDと新しいIDが:

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

私の意見では最も簡単な方法は、私はRETURNING'は、インサートが作成する行と連携 '考えるあなた' example'テーブルに – cha

+0

を 'oldid'列を追加することです - ので、私は他のセットから列を参照カント –

答えて

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

I表'oldid'カラムがない場合は、テーブルを変更せずに行うことができますか? – dtkaias

+0

値を挿入すると、新しい行が作成されます。古い値を取得する場合は、更新ステートメントまたは更新と選択の組み合わせを使用する必要があります – 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 
関連する問題