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

使用TypeORM批量更新时如何忽略DUPLICATE ENTRY错误

解决TypeORM批量插入时忽略重复主键条目问题

你可以通过TypeORM的insert方法配合onConflict配置实现忽略重复条目、继续执行插入操作,针对不同数据库有不同写法,同时需适配你的复合主键:

核心方案:使用insert+onConflict

save方法默认会先查询记录是否存在,遇到主键冲突时直接抛出错误终止操作;而insert配合冲突处理配置能让数据库直接跳过重复项,更适合批量插入场景。

1. 针对PostgreSQL数据库

将你的复合主键字段(替换为你表中实际的主键字段名)填入onConflict语句:

public async saveBulk(historicalPrices: IHistoricalPrice[]) {
  if (!historicalPrices.length) {
    return;
  }
  await this.historicalPricesRepository.insert(historicalPrices, {
    chunk: 200,
    onConflict: `("id", "date") DO NOTHING`,
  });
}

2. 针对MySQL数据库

MySQL需使用ON DUPLICATE KEY UPDATE语法,若只想忽略重复项,可设置更新原字段(相当于无操作):

public async saveBulk(historicalPrices: IHistoricalPrice[]) {
  if (!historicalPrices.length) {
    return;
  }
  await this.historicalPricesRepository.insert(historicalPrices, {
    chunk: 200,
    onConflict: `(id, date) DO UPDATE SET id = id`,
  });
}

若需要在遇到重复时更新其他字段(例如价格字段),可修改为:

onConflict: `(id, date) DO UPDATE SET price = VALUES(price)`

注意事项

  • 确保onConflict中的字段名和你实体类中定义的复合主键字段完全一致
  • insert方法比save更高效,因为它无需先查询数据库,直接执行批量插入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:26:28