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

55 lines
1.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 银行流水批量入库 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`