造数脚本用随机邮箱生成用户,第二遍跑报 1062 Duplicate entry,一百个里撞了三个。CI 上重跑一次就挂。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,随机串只有六位,样本一多就落到同一个值上。唯一索引不接受重复,脚本又没做冲突处理。

「测试造数唯一键」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

INSERT IGNORE INTO users (email, name)
VALUES (CONCAT('u', UNIX_TIMESTAMP(), '-', @i, '@test.local'), 't');

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。

具体做法是,邮箱里拼时间戳或自增序号 保证全局唯一;插入改成 INSERT IGNORE 或先查后插;造数前清掉上一轮数据 别在同一批上叠加;批次号写进日志 方便定位。

最后用这个标准收尾,连跑三遍造数脚本没有 1062 用户总数按批次稳定增长。

作者 9823189