我正在尝试批量更新表users
,该表包含这些列id(主键),状态(文本),活动(数字)。
我从后端接收到的数组是这样的:
[
{ id: 33715, status: 'online', active: 10 },
{ id: 39129, status: 'offline', active: 0.1 },
{ id: 36090, status: 'loggedin', active: 24 },
{ id: 34452, status: 'loggedout', active: 1 },
]
活动时间以小时为单位。现在,我想将此数组批量更新为用户表。因为每个对象代表表格中的一行。
我已经根据此解决方案Patrick Motard尝试了这种方法
function bulkUpdate (records) {
var updateQuery = [
'INSERT INTO users (id, status, active) VALUES',
_.map(records, () => '(?)').join(','),
'ON DUPLICATE KEY UPDATE',
'status = VALUES(status),',
'active = VALUES(active)'
].join(' '),
vals = [];
_(records).map(record => {
vals.push(_(record).values());
});
return knex.raw(updateQuery, vals)
.catch(err => {
console.log(err)
});
}
bulkUpdate(response);
但我收到此错误
错误:“ DUPLICATE”处或附近的语法错误
所以我在这里想念的是什么。并在没有使用promise或bluebird的情况下偶然地找到一个更好的解决方案,然后再做trx.commit,这会消耗大量的cpu和ram。并且没有达到立即更新10,000行的目的
答案 0 :(得分:2)
我在
中看不到任何ON DUPLICATE KEY UPDATE
参考
https://www.postgresql.org/docs/9.5/sql-insert.html
您可以尝试ON CONFLICT DO UPDATE SET
。首先尝试使用普通SQL编写看起来正确的查询,然后将其转换为JavaScript生成的查询很容易。