如何在Sequelize-MySQL中获取更新操作的行ID?
解决Sequelize.update无法获取受影响行ID的问题
问题原因
你遇到的returning: true返回[null, 1]的情况,大概率是因为使用的是MySQL数据库——MySQL本身不支持SQL的RETURNING子句,所以Sequelize的returning参数在MySQL环境下会被忽略,返回数组的第一个元素为null,第二个元素是受影响的行数。如果是PostgreSQL数据库,则可能是模型配置或参数设置问题。
解决方案
情况1:使用MySQL数据库
由于MySQL不支持RETURNING,可以通过以下两种方式获取更新行的ID:
方法1:先查询目标记录,再执行更新
先找到符合条件的单条记录,再调用实例的update方法,直接从实例中获取ID:
// 先查询要更新的记录 const targetVoucher = await Voucher.findOne({ where: { voucher_group_id: 5, used: "0", }, limit: 1 }); if (targetVoucher) { // 执行更新 await targetVoucher.update({ used: "1" }); // 直接获取ID console.log('更新的行ID:', targetVoucher.id); // 输出72这类实际ID }
方法2:使用原始SQL语句
通过Sequelize的原始查询执行更新,结合SELECT语句获取更新后的记录(适合复杂场景):
const [updateResult, selectResult] = await sequelize.query(` UPDATE voucher SET used = '1' WHERE voucher_group_id = 5 AND used = '0' LIMIT 1; SELECT id FROM voucher WHERE voucher_group_id = 5 AND used = '1' LIMIT 1; `); // 从查询结果中提取ID const updatedId = selectResult[0]?.id; console.log('更新的行ID:', updatedId);
情况2:使用PostgreSQL数据库
PostgreSQL原生支持RETURNING子句,只需调整参数配置即可:
- 确保模型定义了主键:检查你的
Voucher模型是否正确声明了主键字段(比如id):
const Voucher = sequelize.define('voucher', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, allowNull: false }, // 其他字段... });
- 指定返回字段并启用plain模式:更新时明确指定
returning为需要的字段,加上plain: true简化返回结果:
const result = await Voucher.update( { used: "1" }, { where: { voucher_group_id: 5, used: "0", }, limit: 1, returning: ['id'], // 只返回ID字段 plain: true // 将返回结果转为单个对象,而非数组 } ); // 提取ID const updatedId = result.id; console.log('更新的行ID:', updatedId); // 输出72这类实际ID
内容的提问来源于stack exchange,提问作者Majid Ghafoorzade
相关产品推荐
相关产品推荐

