Sequelize使用bulkCreate时timestamps未更新、id异常自增怎么处理?
Sequelize bulkCreate 冲突更新问题解决方案
1. createdAt/updatedAt 未自动更新问题
原因
bulkCreate 的 updateOnDuplicate 参数要求你显式指定所有需要在冲突时更新的字段,Sequelize 不会默认将时间戳字段加入更新列表,因此触发更新操作时两个时间戳字段不会自动变更。
解决方法
直接在 updateOnDuplicate 数组中加入 updatedAt 即可,不需要手动给数据加 updatedAt 的值,Sequelize 会自动生成当前时间赋值。如果你的业务需要在更新时同步修改 createdAt,也可以将它加入数组。
修改后的代码示例:
const item = await models.Gsdatatab.bulkCreate(gsdatamodel,{ updateOnDuplicate: ["SCRIP","LTP","OHL","ORB15","ORB30","PRB","CAMARILLA", "updatedAt"] });
注意:如果你是全局开启了 timestamps 配置,不需要额外修改模型定义,上述参数修改即可生效
2. 冲突更新时 id 自增跳号问题
原因
这是数据库底层的执行逻辑导致的,和 Sequelize 无关。以 MySQL 为例,执行 INSERT ... ON DUPLICATE KEY UPDATE 语句时,数据库会先申请自增ID再判断是否冲突,哪怕最终走的是更新逻辑,申请的自增ID也会被消耗,导致自增主键不连续。
解决方法
- 优先推荐业务层面不依赖自增主键的连续性,仅用它做唯一标识即可,这是行业内通用的实践方案。
- 如果必须要连续的序号字段,建议单独新增一个非自增的业务序号字段,不要用自增主键承载业务连续序号的需求。
- 非高并发场景下,如果是MySQL数据库,可以调整参数
innodb_autoinc_lock_mode = 0避免自增ID跳号,但会降低写入并发性能,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者Siba Swain
相关产品推荐
相关产品推荐

