You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS中使用mysql2实现MySQL批量插入多条数据的方法

实现批量插入的修改方案

你可以按照如下方案调整代码,兼容单条/多条数据的批量写入,无需客户端多次调用接口:

  1. 调整参数校验逻辑:先判断接收到的body是否为数组,若为单条对象则自动转为数组统一处理,同时遍历数组内所有元素做字段合法性校验,避免插入中途报错。
  2. 使用mysql2原生支持的批量插入语法,无需手动拼接SQL,兼顾安全性和写入性能。
  3. 调整返回结果:批量插入成功后返回写入条数、首条插入ID等信息供客户端使用。

下面是修改后的完整代码:

const mysql = require('mysql2');
const errorCodes = require('source/error-codes');
const PropertiesReader = require('properties-reader');

const prop = PropertiesReader('properties.properties');

// 推荐使用连接池代替单连接,高并发场景下性能更稳定
const pool = mysql.createPool({
    host: prop.get('server.host'),
    user: prop.get("server.username"),
    password: prop.get("server.password"),
    port: prop.get("server.port"),
    database: prop.get("server.dbname"),
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});
const promisePool = pool.promise();

exports.saveSellerPortfolioItem = async (event, context, callback) => {
    context.callbackWaitsForEmptyEventLoop = false;
    let response;
    try {
        // 基础参数校验
        if (!event.body) {
            response = errorCodes.missing_parameters;
            return callback(null, response);
        }
        let body = JSON.parse(event.body);
        // 兼容单条/多条数据:如果是对象则自动转成单元素数组
        const itemList = Array.isArray(body) ? body : [body];
        // 批量校验所有字段合法性
        const insertParams = [];
        for (const item of itemList) {
            const iduser = Number(item.iduser);
            const title = item.title;
            const description = item.description;
            if (isNaN(iduser) || !title || !description) {
                response = errorCodes.invalid_parameter;
                return callback(null, response);
            }
            insertParams.push([iduser, title, description]);
        }
        // 批量插入SQL
        const sql = "INSERT INTO seller_portfolio_item (iduser, title, description) VALUES ?";
        // 执行插入
        const [result] = await promisePool.query(sql, [insertParams]);
        // 构造成功返回
        response = {
            "statusCode": 200,
            "headers": {
                "Content-Type": "application/json"
            },
            "body": JSON.stringify({
                insertCount: result.affectedRows,
                firstInsertId: result.insertId // 批量插入的insertId为第一条记录的ID,后续ID依次+1
            }),
            "isBase64Encoded": false
        };
        callback(null, response);
    } catch (err) {
        console.log(err.toString());
        if (err.toString().indexOf('cannot be null') >= 0) {
            response = errorCodes.not_null_parameters;
        } else {
            response = errorCodes.internal_server_error;
        }
        callback(null, response);
    }
};

核心改动说明

  • 连接池替代单连接:避免高并发下连接耗尽问题,如果你坚持使用单连接,将promisePool.query替换为con.query即可,语法完全兼容。
  • 入参兼容:自动适配单条对象/数组两种入参格式,原有单条调用的逻辑无需修改。
  • 校验前置:所有字段合法性校验在插入前完成,避免部分插入成功、部分失败的脏数据问题。
  • 性能优势:批量插入性能远高于循环单条插入,数据量越大提升效果越明显。

如果你不想改用async/await的写法,保持原有的回调逻辑即可,只需要将SQL语句和参数构造部分按上述方案调整就能实现批量插入。

内容的提问来源于stack exchange,提问作者PeakGen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:48:03