我有一个表,我试图一次更新多个值。这是表架构:
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]);
我该怎么做?
多值插入语法为:
insert into table values (1,1), (1,2), (1,3), (2,1);
当需要指定列时:
insert into table (user_id, subservice_id) values
(1, 1),
(1, 2),
(1, 3),
(2, 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
krokodilko 答案的简短版本:
insert into user_subservices(user_id, subservice_id)
values(1, unnest(array[1, 2, 3]));
一个稍微相关的答案,因为每次我尝试记住这个解决方案时,我都会不断发现这个问题。 插入多行多列:
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)
SELECT users.id AS user_id, subservice_id
FROM users
CROSS JOIN unnest(ARRAY[1,2,3]) subservice_id;
导入一次值但避免重复的好方法如下:
insert into schema.mytable (col1,col2)
select col1, col2 from schema.mytable
UNION
values
('row1-col1','row1-col2'),
('row2-col1','row2-col2'),
('row3-col1','row3-col2')
except
select col1, col2 from schema.mytable;
对于多个值,此函数可能会有所帮助。
此函数生成多个值
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)