错误1062表示主键或唯一索引值重复导致插入失败;应优先用ON DUPLICATE KEY UPDATE实现“有则更新、无则插入”,或用INSERT IGNORE跳过冲突;PHP中宜结合查重、SQL原生处理或精准捕获SQLSTATE '23000'及错误码1062来应对。

MySQL错误1062:Duplicate entry是什么意思
报错 1062 Duplicate entry 'xxx' for key 'PRIMARY' 表示你试图插入一条数据,但主键(或唯一索引)字段的值已存在。不是语法错,也不是连接失败,是数据库在执行 INSERT 时主动拒绝了重复写入。
INSERT时遇到1062,该用INSERT IGNORE还是ON DUPLICATE KEY UPDATE
两者都能避免报错中断,但行为完全不同:
-
INSERT IGNORE:遇到冲突直接跳过整条语句,不报错也不更新,返回影响行数为0 -
ON DUPLICATE KEY UPDATE:冲突时改用UPDATE,可指定哪些字段要更新,比如UPDATE view_count = view_count + 1 - 如果业务需要“有则更新、无则插入”,且更新逻辑明确,优先选
ON DUPLICATE KEY UPDATE;如果只是防止报错、不关心是否写入成功,INSERT IGNORE更轻量
INSERT INTO users (id, name, email) VALUES (1, 'Alice', 'a@b.com') ON DUPLICATE KEY UPDATE name = VALUES(name), email = VALUES(email);
PHP中用PDO处理1062错误的三种实际做法
不要依赖 try-catch 捕获所有 SQL 错误——太粗暴,也掩盖其他问题。应区分对待:
- 明确知道可能重复(如用户注册填了已存在的手机号),先
SELECT COUNT(*)查重,再决定 INSERT —— 适合低并发场景 - 用
INSERT ... ON DUPLICATE KEY UPDATE一步到位,PHP 中直接执行,检查$pdo->exec()返回值:1表示新增,2表示更新(MySQL 特性) - 若必须用
INSERT且需精确判断是否因主键冲突失败,捕获$e->getCode()是否等于'23000'(SQLSTATE),再检查$e->errorInfo[1]是否为1062
为什么加了UNIQUE索引还总报1062,检查这三处
主键冲突常被误认为是代码问题,其实更多出在表结构或数据本身:
立即学习“PHP免费学习笔记(深入)”;
-
INSERT语句里没显式指定主键字段,而表又没设AUTO_INCREMENT,导致反复插相同默认值(比如全为0或空字符串) - 字段类型不匹配:例如定义的是
VARCHAR(10),但插入超长字符串被截断,多次插入不同长字符串却产生相同截断结果 - 字符集/排序规则(collation)导致“看起来不同,实际相等”:比如
utf8mb4_0900_as_cs和utf8mb4_unicode_ci对大小写或重音符号的处理不同,查不到但索引认为重复
真正麻烦的往往不是怎么绕过1062,而是为什么同一组值在应用层看似可控,到了数据库却触发了唯一约束——得从 SHOW CREATE TABLE 和实际 INSERT 的完整值开始比对。











