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

如何在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子句,只需调整参数配置即可:

  1. 确保模型定义了主键:检查你的Voucher模型是否正确声明了主键字段(比如id):
const Voucher = sequelize.define('voucher', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,
    autoIncrement: true,
    allowNull: false
  },
  // 其他字段...
});
  1. 指定返回字段并启用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:55:16