## [ERR-20260417-003] prisma.upsert 的 update: {} 不会刷新已存在行

**日期**: 2026-04-17
**类别**: Prisma / 测试种子
**严重度**: 中（测试间歇性失败，表现为"我改了种子但测试依然报旧状态"）

### 问题描述

修改集成测试种子里 select 字段的 options（例如把 WARRANTY_STATUS 的 'VALID' 加入），然后跑测试——断言依然 400（code 不在 options 里）。查 DB 发现 options 还是老的。

### 根本原因

测试 setup 里的 `prisma.robotFieldDef.upsert({ where, create, update: {} })`：
- **首次运行**：create 写入最新 options ✅
- **之后运行**：update 是空对象 → 不更新任何字段，选项停留在第一次 create 时的状态 ❌

典型症状：改种子 → 跑测试 → 失败 → DB 里的数据仍是旧值。

### 绕行方案

upsert 如果意图是"每次都写入最新状态"，**`update` 必须和 `create`（去掉唯一字段后）保持一致**：

```ts
const data = { labelEn, type, group, options, ... };
await prisma.robotFieldDef.upsert({
  where: { key },
  create: { key, ...data },
  update: data,  // 关键：update 也写完整 data
});
```

或者更简单：测试种子用 `deleteMany` + `createMany` 重建，避免 upsert 语义陷阱。

### 预防措施

**判断规则**：只要种子可能**需要修改**（而不是纯新增），upsert 的 update 分支必须写入完整字段。空 `update: {}` 只适用于"只在第一次写，之后不动"的场景（例如初始化默认配置不想覆盖用户改过的值）。

### Metadata
- Reproducible: yes
- Related Files: testing/backend/integration/robot-manager/robot-manager.integration.test.ts
