我的知识记录

MySQL ON DUPLICATE KEY UPDATE?mysql on duplicate key update用法,完整解决方案

处理过大量同类问题后,排查路径已经很清晰。

ERROR 1062 (23000): Duplicate entry的意思很明确,往表里插入的数据主键值已经存在了,主键约束要求唯一,重复就报错。这个错误指向性很强,就是数据重复的问题,解决思路要么去重要么改插入方式。

导入数据库时出现1062,通常是目标表里已经有数据了,导入的SQL里又包含相同主键的记录。解决方法是在导出时加--add-drop-table参数,生成的SQL会先DROP TABLE再CREATE TABLE,导入时清空旧表就不会冲突。mysqldump默认就带这个参数。

程序插入数据时报1062,说明业务逻辑没有判断重复。解决方法有几种,用INSERT IGNORE插入,重复的记录会被忽略不报错;用REPLACE INTO,重复时先删旧记录再插新记录;用INSERT ... ON DUPLICATE KEY UPDATE,重复时执行更新操作。根据业务场景选合适的方式。

数据去重可以用SQL语句。先查重复数据,执行SELECT 主键字段, COUNT(*) FROM 表名 GROUP BY 主键字段 HAVING COUNT(*) > 1,找出所有重复的主键。然后保留ID最小的那条,删除其他重复记录,执行DELETE t1 FROM 表名 t1 INNER JOIN 表名 t2 WHERE t1.id > t2.id AND t1.主键字段 = t2.主键字段。删除前务必备份。

导入大数据库前先清空目标库或建一个空库,避免已有数据冲突。如果是增量导入,要确认主键范围不重叠,或者用INSERT IGNORE方式导入。导入完执行SELECT COUNT(*)对比源库和目标库的数据量,确认数据完整没有因为1062丢失记录。

排查过程中每改一项就测试一次,别同时改多个配置。

MySQL ON DUPLICATE KEY UPDATE?mysql on duplicate key update用法,完整解决方案

标签:

更新时间:2026-08-27 10:28:50

上一篇:限制百度蜘蛛抓取频率_robots检测工具与收录恢复

下一篇:FTP登录后看不到文件GoDaddy_FTP连接后列表为空教程详解