複数の値をpostgresテーブルに一度に挿入するにはどうすればよいですか?


93

複数の値を一度に更新しようとしているテーブルがあります。テーブルスキーマは次のとおりです。

    Column     |  Type   | Modifiers 
---------------+---------+-----------
 user_id       | integer | 
 subservice_id | integer |

を持っていて、一度にuser_id複数subservice_idのを挿入したい。Postgresこのようなことをさせてくれる構文はありますか

insert into user_subservices(user_id, subservice_id) values(1, [1, 2, 3]);

どうすればよいですか?


1
シーケンスから挿入する場合、またはを使用する場合は、dba.stackexchange.comgenerate_series
a /

回答:


59

試してみてください:

INSERT INTO user_subservices(user_id, subservice_id) 
SELECT 1 id, x
FROM    unnest(ARRAY[1,2,3,4,5,6,7,8,22,33]) x

デモ:http://www.sqlfiddle.com/#!15 / 9a006 / 1


172

複数値の挿入構文は次のとおりです。

insert into table values (1,1), (1,2), (1,3), (2,1);

しかし、krokodilkoの答えははるかに滑らかです。


これらのメソッドのいずれかで、id?を返す方法もありますか?
dvtan 2017年

2
はい、返品を使用します。"テーブル(id、yada)に値(1,2)、(9,22)を挿入してidを返します;" など
スコットマーロウ2017年

1
また、最近では、CTE別名WITHステートメントがうまく機能することがよくあります。
スコットマーロウ2017年

整数値は上記のように挿入できます。しかし、上記の方法を使用してテキストを挿入している間、列のようなエラーが発生することはありません。insert into orders_cancel_reasons_infos values (1,1,"Changed my mind",1), (2,2,"Quality not satisfactory",1), (3,3,"Incompatible or not useful",1), (4,4,"Damaged product but shipping box is good",1), (5,5,"Items arrived too late",1), (6,6,"Missing part or accessories",1), (7,7,"Product and shipping box are damaged",1), (8,8,"Wrong item was sent",1), (9,9,"Defective item",1), (10,10,"Inaccurate description",1), (11,11,"Other",1);
sankarmuniyappa18年

@sankarmuniyappa' '挿入するテキストには、一重引用符を使用する必要があります。のようなもの insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)が機能します。一重引用符と二重引用符の詳細については、これを確認てください。
dr0pdb

25

krokodilkoの答えの短いバージョン:

insert into user_subservices(user_id, subservice_id) 
values(1, unnest(array[1, 2, 3]));

これは、受け入れられた答えよりも意図を表現していると思います。これは標準のSQLまたはPostgreSQL固有ですか?
バーナード

3
どちらの回答もPostgreSQL固有です。受け入れられた答えは、おそらく他のデータベース、たとえばOracleに簡単に変換されます insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3))
yallie 2017年

おかげで、これは私の意見で受け入れられた答えよりもはるかに理にかなっており、読みやすくなっています。
冷ややかな2018年

1
別のテーブルの情報でこれを使用する方法: insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
Efren 2018年

12

この解決策を思い出そうとするたびにこの質問を見つけ続けるので、少し関連した答えです。複数の列を持つ複数の行を挿入します

insert into user_subservices (user_id, subservice_id)
select *
from unnest(array[1, 2], array[3, 4]);

3

別のテーブルのすべての行について、あるテーブルに複数の行を挿入する必要がある場合の、より堅牢な例:

INSERT INTO user_subservices (user_id, subservice_id)
SELECT users.id AS user_id, subservice_id
FROM users
CROSS JOIN unnest(ARRAY[1,2,3]) subservice_id;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.