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

Sequelize如何获取新增记录的自增ID(无需额外查询)

问题:Sequelize插入自增ID记录后无法获取返回的ID

我有一个int类型的自增id列,执行save操作插入记录时传入的是DEFAULT,希望获取新增记录的id但不想执行额外查询。尝试了以下代码,但返回的auditWithAssignedId的id始终是undefined:

void audit.save().then(auditWithAssignedId => {
  console.log('auditWithAssignedId', auditWithAssignedId);
  this.backup(auditWithAssignedId);
});

对应的模型定义如下:

AccountAudit.init(
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    account: { type: DataTypes.STRING },
    action: { type: DataTypes.STRING },
    executedOn: { type: DataTypes.DATE, defaultValue: DataTypes.Now },
  },
  {
    sequelize,
    schema: 'AUDITS',
    tableName: 'ACCOUNT',
    underscored: true,
    timestamps: false,
  }
});

export class AccountAudit extends Model<
  InferAttributes<AccountAudit>,
  InferCreationAttributes<AccountAudit>
> {
  declare id: CreationOptional<number>;
  declare account: string;
  declare action: AuditAction;
  declare executedOn: CreationOptional<Date>;
}
解决方案

1. 避免显式设置id为DEFAULT

创建audit实例时,不要手动给id赋值为DEFAULT,Sequelize会自动处理自增主键逻辑。如果显式设置id: DEFAULT,会干扰自增机制,导致插入后无法正确返回id。正确的实例创建方式只需传入业务字段:

const audit = AccountAudit.build({
  account: '目标账户',
  action: '操作类型'
});

2. 显式配置returning: true

部分数据库(如PostgreSQL)需要显式声明返回插入后的字段,MySQL虽默认支持,但显式配置更稳妥。在save方法中添加该配置:

audit.save({ returning: true }).then(auditWithAssignedId => {
  console.log('新增记录ID:', auditWithAssignedId.id);
});

3. 核对数据库表结构

确保数据库中AUDITS.ACCOUNT表的id列确实被设置为自增主键,避免模型定义与实际表结构不一致导致的问题。

4. 改用create方法直接创建并返回实例

create方法是Sequelize推荐的创建记录方式,会自动返回包含自增ID的完整实例,无需额外配置:

AccountAudit.create({
  account: '目标账户',
  action: '操作类型'
}).then(auditWithAssignedId => {
  console.log('新增记录ID:', auditWithAssignedId.id);
  this.backup(auditWithAssignedId);
});

内容的提问来源于stack exchange,提问作者LazioTibijczyk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:17:42