插入冲突
冲突处理用于决定插入数据与已有记录匹配时应当报错、忽略还是更新,常见于任务重放、数据同步、重复导入和“存在则更新”场景。它属于 INSERT 的执行策略,不等同于单独执行普通 UPDATE。
处理方式
| 策略 | Oracle 语句 | 结果 |
|---|---|---|
| Into | INSERT INTO ... VALUES (...) | 冲突时由数据库报错 |
| Ignore | MERGE ... WHEN NOT MATCHED THEN INSERT | 已匹配记录保持不变,未匹配记录插入 |
| Update | MERGE ... WHEN MATCHED THEN UPDATE ... WHEN NOT MATCHED THEN INSERT | 已匹配记录更新,未匹配记录插入 |
MERGE 使用 SELECT ... FROM dual 构造源数据,并以实体映射中的主键列作为匹配条件。
如何使用
int rows = lambda.insert(UserInfo.class)
.onDuplicateStrategy(DuplicateKeyStrategy.Update)
.applyEntity(user)
.executeSumResult();
将策略改为 Ignore 可跳过已匹配记录;省略配置或使用 Into 则执行普通 INSERT。通用 API 说明见新增操作。
注意事项
- Ignore 和 Update 必须配置实体主键;dbVisitor 不会自动选择其他业务唯一键。
- 主键映射不会替数据库创建约束,匹配列应能唯一定位记录。
- Ignore 只跳过已匹配记录,不会忽略其他数据库错误。
- MERGE 由数据库一次执行;多条实体写入是否整体提交仍取决于事务边界。