带有 MySQL 的 NodeJS - 从数组中向 SQL 插入多行的最佳方法 [重复]
Posted
技术标签:
【中文标题】带有 MySQL 的 NodeJS - 从数组中向 SQL 插入多行的最佳方法 [重复]【英文标题】:NodeJS with MySQL - best way to insert multiple rows to SQL from an array [duplicate] 【发布时间】:2021-09-09 22:48:55 【问题描述】:我有这个代码:
var user_id = dynamic_var;
db.query(`INSERT INTO messages (message_sender_user_id, message_content, message_to, message_sender_id, message_error, message_succeeded) VALUES (?,?,?,?,0,1);`, [user_id, user_id, content, safe_number, sender_id], (err, result2) =>
if (err)
console.log(err);
if (result2[0].affectedRows)
return res.json(
success: true
);
else
console.log(result2);
return res.json(
success: false
);
);
问题是我得到了一个 JSON 数组,内容如下:
messages: Array(9)
0: to: "123", content: "My Content"
1: to: "124", content: "My Content"
2: to: "125", content: "My Content"
3: to: "126", content: "My Content"
4: to: "127", content: "My Content"
5: to: "128", content: "My Content"
6: to: "129", content: "My Content"
7: to: "130", content: "My Content"
8: to: "131", content: "My Content"
我想将这 8 行一起插入到 SQL 中,其中 message_to 将是 JSON 数组中的“to”,而 content 将是 JSON 数组中的“内容”。
我知道我可以遍历消息并一一插入行,但我认为这不是最好的方法。
编辑:我之所以这么问,是因为可能会有一个用例,有人发送 3000 条消息,而不仅仅是 8 条消息。所以我希望它能够真正快速和优化。
谢谢!
** 编辑 - 我在这里找到了答案 - How do I do a bulk insert in mysql using node.js
这是新代码:
var values = [];
for (let i = 0; i < messages.length; i++)
values.push([user_id, messages[i]['content'], messages[i].to, sender_id, 0, 1]);
db.query(`
INSERT INTO messages (message_sender_user_id, message_content, message_to, message_sender_id, message_error, message_succeeded) VALUES ?;`, [ values], (err, result2) =>
if (err)
return res.json( success: true);
console.log(result2);
if (result2[1].affectedRows)
console.log(result2[1].affectedRows)
return res.json( success: false );
);
【问题讨论】:
为什么你认为这不是最好的方法? @LV98 因为我将不得不调用 db.query 函数,比如说 8 次而不是 1 次。无论如何我都需要返回响应,所以如果我执行 8 次我怎么知道如果一切正常?如果所有查询都正常,我应该创建一个标志变量并更改它吗? Inserting multiple rows in mysql 在 1 个查询中 How do I do a bulk insert in mySQL using node.js @LV98 一次插入一行数据对数据库来说代价高昂,原因之一是它每次都必须写入事务日志。要求它在一个事务中一次写入 1000 行比写入 1000 个事务要高效得多。但通常 1000 次交易并不重要,但想象一下你要跟踪空中的所有人。数以百万计的飞机起飞和降落。那么它就会成为一个问题。从一开始就这样做总是一个好主意。你永远不知道你们中的哪些项目会被取消并永远存在。 【参考方案1】:这是一个基本的例子。
let sql = 'INSERT INTO myTable (to, content) values '
messages.forEach(message =>
sql += '("' + message.to + '","' + message.content + '"),';
// Remove last ,
sql = sql.slice(0,-1);
console.log(sql);
// Expected 'INSERT INTO myTable (to, content) values ("123", "My Content"), ("124", "My Content"), ("125", "My Content")'
【讨论】:
谢谢,但我不是这个意思。 JS 在这里很重要,因为我想插入数组中的所有行。我熟悉这种语法 那么您需要帮助的是迭代数组以创建具有多个值的 sql 字符串的最佳方法? 谢谢!这对我有帮助。但最终我找到了一个更简单的解决方案!我现在发布它 @OrNakash 好吧,我什至不知道该解决方案的存在 :) 但我认为我建议我的解决方案有两个原因。可组合性,另一个建议取决于 mysql 库中的一个函数,不确定是否存在于 Mssql、postgresql 等库中。记录,我倾向于能够从日志中复制/粘贴 sql 并手动运行,尤其是当查询失败。例如,如果更新失败,能够手动运行它可以使它像错误从未发生过一样。缺点是内置函数可以更优化,比如一次只能添加 10k 行。以上是关于带有 MySQL 的 NodeJS - 从数组中向 SQL 插入多行的最佳方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章