## Context 见 proposal.md。000178 在版本 140 之后尚未应用于生产库;其迁移前校验和唯一索引均把所有 `iccid_19` 纳入唯一范围,与双列模型中“20 位卡以完整 `iccid_20` 识别”的语义冲突。 ## Goals / Non-Goals **Goals:** - 在测试环境验证版本 140 生产库所需的 ICCID 索引语义。 - 为两种 ICCID 长度分别建立正确的唯一性约束。 - 保持查询索引名称与现有代码兼容。 **Non-Goals:** - 不清理、合并或修改现有卡数据。 - 不改变 ICCID 查询接口或导入逻辑。 ## Decisions ### 将 000178 的唯一范围限定为对应原始长度 `iccid_19` 冲突扫描和唯一索引增加 `length(iccid) = 19`;`iccid_20` 冲突扫描和唯一索引增加 `length(iccid) = 20`。 直接修正 000178,而不是新增后续迁移:生产库仍位于版本 140,必须能连续执行历史链路;新增迁移无法绕过 000178 的失败。该文件尚未在生产应用,变更需在上线前完成仓库内所有消费方同步。 ### 保留双列格式校验 保留对 19/20 位原始值与派生列对应关系的校验,避免仅放宽唯一索引而掩盖错误回填。 ## Risks / Trade-offs - [测试库已处于更高迁移版本] → 直接按修正后的 000178 谓词定向重建两个索引并核对结果。 - [其他环境已经执行旧版 000178] → 迁移内容不会自动重放;上线前以索引定义核对并按同一谓词重建。 - [错误编辑已发布迁移] → 仅限生产首次执行前的本次兼容修正,发布说明记录文件校验值。 ## Migration Plan 1. 在测试环境停止卡写入后,按修正后的 000178 谓词定向重建两个 ICCID 唯一索引。 2. 验证两个索引均为唯一索引且谓词按原始 ICCID 长度限定,并执行 19/20 位重复组检查。 3. 测试完成后保留修正后的索引;不对生产库执行迁移或验证操作。