如何使用mysql2模块获取INSERT INTO操作插入的行数据及自增ID?
在mysql2中获取INSERT操作的自增ID与插入行数据
首先,你看到的hola[object Object]是因为直接把对象和字符串拼接导致的,改成console.log('hola', results)或者console.log('hola', JSON.stringify(results))就能看到results的实际结构了。
获取自增ID
mysql2执行INSERT后返回的results对象里自带insertId属性,直接就能拿到该行的自增主键:
console.log('插入的自增ID:', results.insertId);
先修复SQL注入风险
你当前用字符串拼接生成SQL的写法有严重的SQL注入漏洞,必须改成参数化查询:
const queryFirstTable = 'INSERT INTO devicesdb.devices (token) VALUES (?)'; pool.execute(queryFirstTable, [req.body.token], (err, results) => { // ...后续逻辑 });
用?作为占位符,把参数放在数组里传入,mysql2会自动处理转义,杜绝注入风险。
获取完整插入行数据
INSERT操作本身不会返回完整的行数据,只能拿到操作状态和自增ID。如果需要完整行,得在插入后立即执行SELECT查询:
回调风格示例
router.post('/devices', (req, res) => { const insertQuery = 'INSERT INTO devicesdb.devices (token) VALUES (?)'; pool.execute(insertQuery, [req.body.token], (err, insertResults) => { if (err) { console.error(err); return res.status(500).send('插入失败'); } const insertedId = insertResults.insertId; // 查询刚插入的行 const selectQuery = 'SELECT * FROM devicesdb.devices WHERE id = ?'; pool.execute(selectQuery, [insertedId], (selectErr, selectResults) => { if (selectErr) { console.error(selectErr); return res.status(500).send('查询插入数据失败'); } const insertedRow = selectResults[0]; console.log('插入的完整行:', insertedRow); res.json({ message: '插入成功', data: insertedRow }); }); }); });
async/await风格(更简洁)
如果你的项目支持async/await,可以用Promise风格减少回调嵌套:
router.post('/devices', async (req, res) => { try { // 执行插入 const [insertResults] = await pool.execute('INSERT INTO devicesdb.devices (token) VALUES (?)', [req.body.token]); const insertedId = insertResults.insertId; // 查询完整行 const [selectResults] = await pool.execute('SELECT * FROM devicesdb.devices WHERE id = ?', [insertedId]); const insertedRow = selectResults[0]; console.log('插入的完整行:', insertedRow); res.json({ message: '插入成功', data: insertedRow }); } catch (err) { console.error(err); res.status(500).send('操作失败'); } });
内容的提问来源于stack exchange,提问作者Aleix
相关产品推荐
相关产品推荐

