使用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
相关产品推荐
相关产品推荐

