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

Sequelize v6升级后MySQL中returning: true不生效问题求助

Sequelize v6 + MySQL 获取更新后记录的解决办法

在Sequelize v6中操作MySQL时,update方法的returning参数会被忽略——这是因为MySQL本身的UPDATE语句不支持RETURNING子句(该特性仅适用于PostgreSQL、SQLite等数据库),所以你会得到[undefined, 1]这样的返回值(其中1是受影响的行数)。

要获取更新后的记录,有两种可靠的替代方案:

方案一:先更新再查询

先执行update操作确认记录被修改,再通过主键查询最新的记录:

app.get("/global", async (req, res, next) => {
  // 执行更新,获取受影响的行数
  const [updatedCount] = await Model.update({ total: 11 }, { where: { id: 172 } });
  
  // 处理无记录被更新的情况
  if (updatedCount === 0) {
    return res.json({ success: false, message: "未找到要更新的记录" });
  }

  // 查询更新后的完整记录
  const updatedRecord = await Model.findByPk(172);

  console.log(updatedRecord);
  res.json({ success: true, data: updatedRecord });
});

方案二:查询后修改并保存

先通过主键查询到目标实例,修改实例属性后调用save()方法,这种方式会自动生成原子性的UPDATE语句,同时直接返回更新后的实例:

app.get("/global", async (req, res, next) => {
  // 查询目标记录
  const record = await Model.findByPk(172);
  
  if (!record) {
    return res.json({ success: false, message: "未找到目标记录" });
  }

  // 修改属性并保存
  record.total = 11;
  const updatedRecord = await record.save();

  console.log(updatedRecord);
  res.json({ success: true, data: updatedRecord });
});

注意:如果你的业务场景存在高并发更新的情况,方案二更安全——因为save()方法会基于实例的主键生成带WHERE条件的UPDATE语句,能避免并发更新导致的数据覆盖问题。

内容的提问来源于stack exchange,提问作者Md Saif Uddin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:40:04