nodejs mysql批量插入重复密钥更新

Posted

技术标签:

【中文标题】nodejs mysql批量插入重复密钥更新【英文标题】:nodejs mysql bulk INSERT on DUPLICATE KEY UPDATE 【发布时间】:2017-10-17 00:24:34 【问题描述】:

我正在尝试使用一个 mysql 语句插入大约 1000 行,如果键已经存在,则更新该行。

我在 nodejs 中使用 this 模块进行此操作。

我的代码目前如下所示:

this.conn.query("INSERT INTO summoners VALUES ?" +
    " ON DUPLICATE KEY UPDATE name = VALUES(name), rank = VALUES(rank), points = VALUES(points), satisfyCriteria = VALUES(satisfyCriteria), priority = VALUES(priority)," +
    " recentlyChecked = VALUES(recentlyChecked), hotStreak = VALUES(hotStreak), veteran = VALUES(veteran), freshBlood = VALUES(freshBlood), " +
    " wins = VALUES(wins), losses = VALUES(losses)", sql_data, (err) => 
    if( err )
        logger.error("Error during summoner insert ", err)
    
    else 
        cb();
    
)

sql_data 是一个嵌套数组。根据 libaray 的文档:

嵌套数组被转换为分组列表(用于批量插入),例如 [['a', 'b'], ['c', 'd']] 变成 ('a', 'b'), ('c', 'd')

因此我认为这应该可行,但目前我收到此错误

 Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Hy Dag3', '55040464', 'master', 114, true, false, false, false, true, false, 34' at line 1

调试 sql 如下所示:

'INSERT INTO summoners VALUES \'Hy Dag3\', \'55040464\', \'master\', 114, true, false, false, false, true, false, 343, 279 ON DUPLICATE KEY UPDATE name = VALUES(name), rank = VALUES(rank), points = VALUES(points), satisfyCriteria = VALUES(satisfyCriteria), priority = VALUES(priority), recentlyChecked = VALUES(recentlyChecked), hotStreak = VALUES(hotStreak), veteran = VALUES(veteran), freshBlood = VALUES(freshBlood),  wins = VALUES(wins), losses = VALUES(losses)'

这是不正确的。

谁能帮我完成这项工作?

【问题讨论】:

【参考方案1】:

我会尝试一组对象

[
 name:'Hy Dag3', points:'55040464', rank:'master', hotStreak:114,...,
 name:'Hkj', points:'554064', rank:'novice', hotStreak:14,...
]

然后

this.conn.query("INSERT summoners SET ? " +
" ON DUPLICATE KEY UPDATE name = VALUES(name), rank = VALUES(rank)...

因为根据文档:

var post  = id: 1, title: 'Hello MySQL';
var query = connection.query('INSERT INTO posts SET ?', post, function (error, results, fields) 
  if (error) throw error;
  // Neat!
);
console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'

【讨论】:

谢谢,不幸的是,这只会更新一个条目而不是整个数组。 @JakobAbfalter 你找到解决办法了吗?【参考方案2】:

尝试将您的 sql_data 数组数组放入另一个这样的数组中

this.conn.query("...your query", [sql_data], (err) => ...)

所以你在你的陈述中匹配问号,所以如果有另一个问号,它看起来像[sql_data, another_variable]

【讨论】:

这是一个正确的答案。 sql_data 应该根据这篇文章放在另一个数组中 ***.com/a/14259347/2311651

以上是关于nodejs mysql批量插入重复密钥更新的主要内容,如果未能解决你的问题,请参考以下文章

c#中往mysql里批量插入上万条数据,有比较高效的方法吗

mysql存储过程怎样批量插入数据

sql mysql批量插入,具有重复键更新(upsert),并具有条件数据更新

MyCat批量插入

mysql批量更新,数据存在则更新,不存在则插入

如何在 NodeJS 中将数据批量插入 MySQL?