# 银行流水批量入库 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: ```sql ON DUPLICATE KEY UPDATE bank_statement_id = bank_statement_id ``` `bank_statement_id` 是自增主键。当前 MySQL 版本在 `INSERT ... ON DUPLICATE KEY UPDATE` 场景下,若 duplicate 分支显式更新自增列,即使是自赋值,也会触发 `1869`。 ## 本次修改 1. 将 `insertBatch` 的 duplicate 分支从自增主键自赋值改为普通字段自赋值: ```sql ON DUPLICATE KEY UPDATE batch_id = batch_id ``` 2. 新增 Mapper XML 回归测试,约束批量去重 SQL 不得再更新自增主键。 ## 影响说明 - 新流水:仍正常插入。 - 重复流水:仍按唯一键命中后跳过,不改写已有业务数据。 - 非重复键的其他 SQL 错误:仍然继续抛出,不会被静默吞掉。 ## 验证 执行命令: ```bash mvn test -pl ccdi-project -Dtest=CcdiBankStatementMapperXmlTest,CcdiFileUploadServiceImplTest ``` 重点关注: - `insertBatch_shouldAvoidUpdatingAutoIncrementPrimaryKeyInDuplicateBranch` - `processFileAsync_shouldMarkParsedFailedWhenInsertBatchThrowsUnexpectedSqlError`