NodeJS执行MySQL UPDATE操作后如何获取被影响行的具体数据
Node.js MySQL UPDATE语句获取受影响行具体数据的实现方案
MySQL原生UPDATE操作默认仅返回影响行数、变更行数等元数据,不会返回行的具体内容,可通过以下两种方案实现需求:
方案1:事务包裹「查询+更新」操作(兼容所有MySQL版本)
该方案不受MySQL版本限制,通过事务保证查询和更新的原子性,避免并发场景下数据不一致的问题。
// 开启事务 connection.beginTransaction(async function(err) { if (err) throw err; try { // 1. 用和UPDATE完全一致的WHERE条件查询待修改的行数据 const selectSql = "SELECT * FROM table WHERE columnB = valB"; const [targetRows] = await connection.promise().query(selectSql); console.log('待更新的行数据:', targetRows); // 2. 执行UPDATE操作 const updateSql = "UPDATE table SET columnA = valA WHERE columnB = valB"; const [updateResult] = await connection.promise().query(updateSql); console.log(`更新完成,影响行数:${updateResult.affectedRows}`); // 3. 提交事务 connection.commit(function(err) { if (err) { return connection.rollback(function() { throw err; }); } // 可直接使用前面查询到的targetRows做后续逻辑 const id = targetRows[0]?.id; }); } catch (e) { connection.rollback(function() { throw e; }); } });
注意:如果不使用事务,高并发场景下可能出现SELECT之后、UPDATE之前有其他请求修改对应行数据的问题,导致拿到的查询数据和实际更新的数据不一致,必须加事务保证操作原子性。
方案2:使用UPDATE RETURNING语法(仅支持MySQL 8.0及以上版本)
MySQL 8.0版本新增了RETURNING子句,可以在UPDATE、INSERT、DELETE操作执行后直接返回指定字段,不需要额外执行查询,性能更好。
const sql = "UPDATE table SET columnA = valA WHERE columnB = valB RETURNING id, columnA, columnB"; connection.query(sql, function(err, rows, fields) { if (err) throw err; // 这里的rows就是更新后的受影响行的具体数据,和SELECT查询返回的格式完全一致 const id = rows[0]?.id; const updatedColumnA = rows[0]?.columnA; console.log('更新后的行数据:', rows); });
内容的提问来源于stack exchange,提问作者KANAYO AUGUSTIN UG
相关产品推荐
相关产品推荐

