带有 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 插入多行的最佳方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs 从 MySQL 查询结果创建新数组

nodejs mysql查询数据以循环数组

如何从属于 UITableView 中的模型数组对象的数组中向 tableView 显示数据?

在 NodeJS 中向外行用户隐藏 Web 服务

在单个 JSON Patch 操作中向数组添加多个值?

如何在 reactjs 中向 nodejs RESTful API 发出 POST 请求