【发布时间】:2019-08-28 00:13:22
【问题描述】:
我正在尝试批量更新表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 },
]
active 是以小时为单位的时间。现在我想将此数组批量更新到用户表中。因为每个对象代表表中的一行。
我已经根据这个解决方案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”处或附近的语法错误
所以我在这里缺少什么。并且有没有人在不使用承诺或蓝鸟的情况下有更好的解决方案然后执行 trx.commit ,这会消耗大量的 CPU 和内存。并且没有达到一次更新 10,000 行的目的
【问题讨论】: