MySQL创建唯一索引时报错Duplicate entry * for key问题

 更新时间:2022年09月27日 08:35:51   作者:三爷麋了鹿  
这篇文章主要介绍了MySQL创建唯一索引时报错Duplicate entry * for key问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

创建唯一索引时报错Duplicate entry * for key

场景

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

UNI 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个字符,至此揭开了谜底。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • win2003 mysql单向同步配置步骤[已测]

    win2003 mysql单向同步配置步骤[已测]

    为了服务器安全特将mysql同步了下,由于时间长了经常忘记,特以此整理下了,方便经常支持脚本之家的朋友。
    2011-06-06
  • Mysql通过explain分析定位数据库性能问题

    Mysql通过explain分析定位数据库性能问题

    这篇文章主要介绍了Mysql通过explain分析定位数据库性能问题,明确SQL在Mysql中实际的执行过程是怎样的,如果查询字段没有索引则增加索引,如果有索引就要分析为什么没有用到索引,本文详细讲解,需要的朋友可以参考下
    2023-01-01
  • Shell下实现免密码快速登陆MySQL数据库的方法

    Shell下实现免密码快速登陆MySQL数据库的方法

    这篇文章主要给大家介绍了在Shell下实现免密码快速登陆MySQL数据库的方法,文中通过示例代码一步步介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编来一起看看吧。
    2017-06-06
  • MySQL与PHP的基础与应用专题之索引

    MySQL与PHP的基础与应用专题之索引

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,本系列将带你掌握php与mysql的基础应用,本篇从索引开始
    2022-02-02
  • Mysql触发器字段双向更新方式

    Mysql触发器字段双向更新方式

    这篇文章主要介绍了Mysql触发器字段双向更新方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • mysql charset=utf8你真的弄明白意思了吗

    mysql charset=utf8你真的弄明白意思了吗

    这篇文章主要介绍了mysql charset=utf8你真的弄明白意思了吗?文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • mysql SELECT语句去除某个字段的重复信息

    mysql SELECT语句去除某个字段的重复信息

    mysql SELECT语句去除某个字段的重复信息,需要的朋友可以收藏下。
    2010-04-04
  • MySQL索引操作命令详解

    MySQL索引操作命令详解

    这篇文章主要介绍了MySQL索引操作命令详解,需要的朋友可以参考下
    2017-01-01
  • MySQL数据库的多表操作

    MySQL数据库的多表操作

    这篇文章主要介绍了MySQL数据库的多表操作,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-08-08
  • MySQL死锁问题排查与详细分析

    MySQL死锁问题排查与详细分析

    数据库管理系统中,死锁是指多个事务互相等待对方释放资源,导致事务僵持不前,影响系统稳定性,本文详细介绍了如何在MySQL中排查和分析死锁问题,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09

最新评论