Sequelize多对多关联下如何批量插入中间表FlatMember关联数据?
多对多中间表FlatMember批量插入最优方案
你可以直接使用中间表模型FlatMember自带的bulkCreate方法实现批量插入,这是目前性能最高的实现方式,全程只需要执行1次批量插入SQL,远优于循环调用setFlats的方案。
基础实现(追加关联)
如果你只需要往中间表追加新的关联,不需要覆盖用户原有关联,直接使用以下代码即可:
await FlatMember.bulkCreate(flatMemberArray, { // 可选配置:若已设置userId+flatId联合唯一约束,开启后可忽略重复数据不报错 ignoreDuplicates: true, // 可选配置:重复数据出现时需要更新的字段,可替换ignoreDuplicates使用 // updateOnDuplicate: ['updatedAt'], // 可选配置:是否触发单个实例的创建钩子,默认关闭,开启会略微降低性能 // individualHooks: true });
覆盖原有关联的实现
如果你需要和setFlats一样,先清空对应用户的原有关联再插入新关联,可以配合事务实现原子操作,避免数据不一致:
const transaction = await sequelize.transaction(); try { // 提取所有需要更新关联的用户ID const userIds = [...new Set(flatMemberArray.map(item => item.userId))]; // 批量删除这些用户的旧关联 await FlatMember.destroy({ where: { userId: userIds }, transaction }); // 批量插入新关联 await FlatMember.bulkCreate(flatMemberArray, { transaction }); await transaction.commit(); } catch (error) { await transaction.rollback(); throw error; }
注意事项
bulkCreate默认不会触发单个实例的beforeCreate、afterCreate等钩子,如果需要触发钩子可以手动开启individualHooks: true配置,即使开启后性能也远高于循环插入单条数据。- 建议给
FlatMember表添加userId和flatId的联合唯一约束,避免出现重复的关联数据。
内容的提问来源于stack exchange,提问作者Himanshu Modi
相关产品推荐
相关产品推荐

