MySQL创建唯一索引时报错Duplicate entry * for key问题
创建唯一索引时报错Duplicate entry * for key
场景
在MySQL表创建唯一索引时,出现报错Duplicate entry * for key.

使用show index from table确认table中并不存在重名的唯一索引键名称。
解决
仔细看报错信息,根据那串ID数字,发现是表中出现违反创建的唯一索引键规则的重复数据,将此数据删除后创建唯一索引成功。
ALTER TABLE person ADD UNIQUE `UNI_person_area`(`person_id`, `area_id`) USING BTREE COMMENT "人员重复";
MySQL唯一索引报错信息只显示前64位
MySQL的报错信息有时可能和大家预期的不一样,本文将根据实际案例演示最常见的唯一索引报错与预期情况有差异,不了解的同学可能以为有bug。
1.数据准备
1.1创建一个含唯一索引的表
-- 创建一张test表 CREATE TABLE test ( id INT PRIMARY KEY AUTO_INCREMENT, c1 VARCHAR (31), c2 VARCHAR (32), c3 VARCHAR (8), c4 INT, UNIQUE KEY uq_c1_c2_c3 (c1, c2, c3) );
1.2插入一批数据
insert into `test` (`id`, `c1`, `c2`, `c3`, `c4`) values('1','90806443B5534D33B652929F5205E4F','5b612c194383488fad19e2889cf077f5','202204','1000000');
insert into `test` (`id`, `c1`, `c2`, `c3`, `c4`) values('2','988806443B5534D33B652929F5205E4','077f55b612c194383488fad19e2889cf','202205','2000000');
insert into `test` (`id`, `c1`, `c2`, `c3`, `c4`) values('3','988806443B5534D33B652929F5205E','5b612c194383488fad19e2889cf077f5','202204','1000000');1.3插入一条唯一索引冲突的数据
INSERT INTO `test` (`id`, `c1`, `c2`, `c3`, `c4`) VALUES('4','90806443B5534D33B652929F5205E4F','5b612c194383488fad19e2889cf077f5','202204',200000);报错信息如下:
错误代码:1062
Duplicate entry '90806443B5534D33B652929F5205E4F-5b612c194383488fad19e2889cf077f5'
for key 'uq_c1_c2_c3'
报错信息中只有c1(90806443B5534D33B652929F5205E4F)和c2(5b612c194383488fad19e2889cf077f5)的值,无c3(202204)的值,有时如果批量插入过多的行时,无法快速定位哪一行冲突,不便于快速排查问题。
2.原因探索
从报错信息中可以发现,c1、c2、'-'连接符总长度为64个字符,可以从源码着手。
在源码 errmsg-utf8 文件中,可以发现有如下信息:
eng "Duplicate entry '%-.64s' for key '%-.192s'"
也就是,报错信息中内容的有64个字符,key的名字为192个字符,至此揭开了谜底。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
driver-class-name: com.mysql.jdbc.Driver爆红的问题解决
在springboot项目工程中想要进行数据库配置,driver-class-name: com.mysql.cj.jdbc.Driver始终报错,本文就来介绍一下如何解决,感兴趣的可以了解一下2024-07-07
Windows系统下MySQL忘记root密码的2种解决办法
这篇文章主要介绍了Windows系统下MySQL忘记root密码的2种解决办法,一种是通过启动MySQL时跳过权限表验证,然后重置密码,另一种是创建一个包含新密码的文本文件,并通过MySQL的--init-file选项来应用该文件中的密码设置,需要的朋友可以参考下2024-11-11
MySQL5.7升级MySQL8.0的完整卸载与安装及连接Navicat的步骤
因为一个项目交接需要需要将mysql物理备份文件还原至MySQL5.7,并且将mysql5.7升级到MySQL8.0,下面这篇文章主要给大家介绍了关于MySQL5.7升级MySQL8.0的完整卸载与安装及连接Navicat的相关资料,需要的朋友可以参考下2023-03-03
MYSQL row_number()与over()函数用法详解
这篇文章主要介绍了MYSQL row_number()与over()函数用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下2021-08-08
DB为何大量出现select @@session.tx_read_only 详解
这篇文章主要给大家介绍了关于DB为何大量出现select @@session.tx_read_only 的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2018-04-04


最新评论