# 银行流水批量入库 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`

