如何一次将多个值插入到 postgres 表中?
Posted
技术标签:
【中文标题】如何一次将多个值插入到 postgres 表中?【英文标题】:How do I insert multiple values into a postgres table at once? 【发布时间】:2014-01-15 21:24:11 【问题描述】:我有一个表,我试图一次更新多个值。这是表架构:
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]);
我该怎么做?
【问题讨论】:
如果你想从一个序列中插入它们,或者使用generate_series
见dba.stackexchange.com/a/89544/16892
【参考方案1】:
试试:
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
【讨论】:
【参考方案2】:多值插入语法为:
insert into table values (1,1), (1,2), (1,3), (2,1);
但是 krokodilko 的回答要狡猾得多。
【讨论】:
使用这两种方法中的任何一种,有没有办法同时返回id
?
是的,使用返回。 “插入表(id,yada)值(1,2),(9,22)返回id;”等
现在 CTE 又名 WITH 语句通常效果很好。
整数值可以像上面那样插入。但是,在使用上述方法插入文本时,不存在类似列的错误。 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);
@sankarmuniyappa 您必须为要插入的文本使用单引号 ' '
。所以像insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)
这样的东西会起作用。您可以查看this 以了解有关单引号和双引号的更多信息。【参考方案3】:
一个稍微相关的答案,因为我每次尝试记住这个解决方案时都会发现这个问题。 插入多行多列:
insert into user_subservices (user_id, subservice_id)
select *
from unnest(array[1, 2], array[3, 4]);
【讨论】:
【参考方案4】:krokodilko 答案的简短版本:
insert into user_subservices(user_id, subservice_id)
values(1, unnest(array[1, 2, 3]));
【讨论】:
我认为这比接受的答案更能表达意图。这是标准 SQL 还是 PostgreSQL 特定的? 两个答案都是 PostgreSQL 特定的。接受的答案可能更容易转换为其他数据库,例如 Oracle:insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3))
。
谢谢,这比我认为接受的答案更有意义,更易读。
一种将其与另一个表中的信息一起使用的方法:insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
【参考方案5】:
更健壮的例子,当您需要为另一个表中的每一行插入多行时:
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;
【讨论】:
以上是关于如何一次将多个值插入到 postgres 表中?的主要内容,如果未能解决你的问题,请参考以下文章