如何使用Node.js向MySQL数据库插入数组类型数据
解决方案
你之前的写法无法生效是因为 INSERT INTO ... SET ? 语法仅支持单条数据对象的插入映射,无法自动解析数组为多条插入记录。以下是两种常用的正确实现方式:
方法1:使用批量插入语法(推荐,性能最优)
这是最常用的批量插入写法,SQL语法为 INSERT INTO 表名 (字段列表) VALUES ?,参数传入二维数组格式的所有值,适用于mysql、mysql2等主流Node.js MySQL驱动:
let post = [ {id: 1, name: 'Terminal 1'}, {id: 2, name: 'Terminal 2'} ]; // 手动指定字段映射,也可以动态从对象提取 const values = post.map(item => [item.id, item.name]); db.query('INSERT INTO terminal (id, name) VALUES ?', [values], (err, result) => { if (err) throw err; console.log(`成功插入${result.affectedRows}条数据`); });
如果需要动态适配对象字段,不用手动写死字段,可以用如下更灵活的写法:
let post = [ {id: 1, name: 'Terminal 1'}, {id: 2, name: 'Terminal 2'} ]; // 从第一条数据提取字段,自动加反引号避免关键字冲突 const fields = Object.keys(post[0]).map(field => `\`${field}\``); // 按字段顺序生成二维值数组 const values = post.map(item => fields.map(field => item[field.replace(/`/g, '')])); db.query(`INSERT INTO terminal (${fields.join(',')}) VALUES ?`, [values], (err, result) => { if (err) throw err; // 后续业务逻辑 });
方法2:循环单条插入(仅适合小数据量场景)
如果数据量非常小(10条以内),也可以循环调用单条插入逻辑,写法简单但会发起多次数据库请求,性能较差:
let post = [ {id: 1, name: 'Terminal 1'}, {id: 2, name: 'Terminal 2'} ]; for (const item of post) { db.query('INSERT INTO terminal SET ?', item, (err) => { if (err) throw err; }); }
内容的提问来源于stack exchange,提问作者Rafael Segura
相关产品推荐
相关产品推荐

