Files
ccdi/docs/reports/implementation/2026-03-20-bank-statement-mysql1869-fix.md

1.5 KiB
Raw Blame History

银行流水批量入库 MySQL 1869 修复记录

背景

文件上传解析完成后,CcdiFileUploadServiceImpl.fetchAndSaveBankStatements 调用 CcdiBankStatementMapper.insertBatch 批量写入 ccdi_bank_statement。 线上报错如下:

  • MySQL 错误码:1869
  • 异常信息:Auto-increment value in UPDATE conflicts with internally generated values

根因

ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml 中的批量插入 SQL 使用了 no-op upsert

ON DUPLICATE KEY UPDATE
  bank_statement_id = bank_statement_id

bank_statement_id 是自增主键。当前 MySQL 版本在 INSERT ... ON DUPLICATE KEY UPDATE 场景下,若 duplicate 分支显式更新自增列,即使是自赋值,也会触发 1869

本次修改

  1. insertBatch 的 duplicate 分支从自增主键自赋值改为普通字段自赋值:
ON DUPLICATE KEY UPDATE
  batch_id = batch_id
  1. 新增 Mapper XML 回归测试,约束批量去重 SQL 不得再更新自增主键。

影响说明

  • 新流水:仍正常插入。
  • 重复流水:仍按唯一键命中后跳过,不改写已有业务数据。
  • 非重复键的其他 SQL 错误:仍然继续抛出,不会被静默吞掉。

验证

执行命令:

mvn test -pl ccdi-project -Dtest=CcdiBankStatementMapperXmlTest,CcdiFileUploadServiceImplTest

重点关注:

  • insertBatch_shouldAvoidUpdatingAutoIncrementPrimaryKeyInDuplicateBranch
  • processFileAsync_shouldMarkParsedFailedWhenInsertBatchThrowsUnexpectedSqlError