如何一次向 postgres 表中插入多个值?

我有一个表,我试图同时更新多个值:

    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]);

我要怎么做?

140337 次浏览

试试:

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

多值插入语法如下:

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

但是 Krokodilko 的回答要圆滑得多。

这是一个稍微相关的答案,因为每次我试图记住这个答案的时候,我总能找到这个问题。 插入具有多列的多行:

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

克罗科迪尔科回答的一个简短版本是:

insert into user_subservices(user_id, subservice_id)
values(1, unnest(array[1, 2, 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;

对于多个值,此函数可能有所帮助。

此函数生成多个值

const _multiInsert = arrOfValues => {
// removes lastCharacter
const _remLastChar = str => str.slice(0, str.length - 1);


let foramttedQuery = '';


arrOfValues.forEach(row => {
let newRow = '';
for (const val of Object.values(row)) {
let newValue = '';
if (typeof val === 'string') newValue = `'${val}',`;
else newValue = `${val},`;
newRow = newRow.concat(newValue);
}


foramttedQuery = foramttedQuery.concat(`(${_remLastChar(newRow)}),`);
});


return _remLastChar(foramttedQuery);
};


const arr_Of_Values = [
{
id: 1,
name: "SAMPLE_NAME_1",
},
{
id: 2,
name: "SAMPLE_NAME2",
}
]


const query_template = `INSERT INTO TABLE_NAME VALUES ${_multiInsert(arr_Of_Values)}`
    

console.log(query_template)