mysql error 1071: 创建唯一索引时字段长度限制的问题

目录
  • 一、先描述一下问题吧
  • 二、显而易见
  • 三、问题和解决方案分析

一、先描述一下问题吧

如下创建表时候报错了

CREATE TABLE `xxx` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `sys_code` varchar(255) DEFAULT NULL COMMENT '系统编码',
  `module_name` varchar(1000) DEFAULT NULL COMMENT '模块名',
  `call_num` bigint(20) DEFAULT NULL COMMENT '调用次数',
  `cost_dis` varchar(50) DEFAULT NULL COMMENT '耗时分布',
  `date_time` varchar(50) DEFAULT NULL COMMENT '日期时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `sys_code` (`sys_code`, `module_name`, `cost_dis`, `date_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
> 1071 - Specified key was too long; max key length is 3072 bytes
> 时间: 0s

二、显而易见

提示就是长度太长超过了mysql的最大配置。

三、问题和解决方案分析

1、首先考虑是否有方法将mysql这个长度限制调大

查了一下,如下操作:

(1)set global innodb_large_prefix=1;

mysql> show variables like 'innodb_large_prefix';                                                                                                                                                                                                
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_large_prefix | ON    |
+---------------------+-------+
1 row in set (0.00 sec)

(2)set global innodb_file_format=BARRACUDA;

mysql> show variables like 'innodb_file_format';  
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| innodb_file_format | Barracuda |
+--------------------+-----------+
1 row in set (0.00 sec)

如果已经设置,还是创建不成功,只能考虑方案二

2、一般来说,唯一索引长度不应该太长

因为mysql会根据这个唯一索引做了一系列的操作,所以

(1)重新审核需求看看这样的唯一索引是否合理,看看能不能减少字段

(2)实在是不行,只能根据具体情况,将字段的长度调整小

比如,上面的例子就是没办法减少字段的,但是我又一定要建立唯一索引,最终,我选择了调整字段长度,将module_name的长度减少到了255,再次创建表,已成功。

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

(0)

相关推荐

  • 深入聊聊MySQL中各种对象的大小长度限制

    目录 标识符的长度限制 权限表中范围字段的长度限制 数据库和表的数量限制 表大小的限制 字段数量和数据行大小的限制 字段数量限制 数据行大小限制 数据行大小限制示例 总结 今天给大家介绍一下 MySQL 8.0 中的各种对象的大小.长度以及数量限制. 标识符的长度限制 下表描述了各种不同类型标识符的最大长度. 标识符 最大长度(字符) 数据库 64(包括 NDB Cluster 8.0.18 以及更高版本) 表 64(包括 NDB Cluster 8.0.18 以及更高版本) 字段 64 索引

  • MySQL批量插入和唯一索引问题的解决方法

    MySQL批量插入问题 在开发项目时,因为有一些旧系统的基础数据需要提前导入,所以我在导入时做了批量导入操作 ,但是因为MySQL中的一次可接受的SQL语句大小受限制所以我每次批量虽然只有500条,但依然无法插入,这个时候代码报错如下: nested exception is com.mysql.jdbc.PacketTooBigException: Packet for query is too large (5677854 > 1048576). You can change this va

  • MySQL索引长度限制原理解析

    这篇文章主要介绍了MySQL索引长度限制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 索引 TextField是不支持建立索引的 MySQL对索引字段长度有限制 innodb引擎的每个索引列长度限制为767字节(bytes),所有组成索引列的长度和不能大于3072字节 myisam引擎的每个索引列长度限制为1000字节,所有组成索引列的长度和不能大于1000字节 varchar的最大长度是指字符长度,若数据库字符集为utf-8,则一个

  • 一文弄懂MySQL索引创建原则

    目录 一.适合创建索引 1.字段的数值有唯一性限制 2.频繁作为Where查询条件的字段 3.经常Groupby和Orderby的列 4.Update.Delete的where条件列 5.Distinct字段需要创建索引 6.多表Join连接操作时,创建索引注意事项 7.使用列的类型小的创建索引 8.使用字符串前缀创建索引 9.区分度高的列适合作为索引 10.使用最频繁的列放到联合索引的左侧 11.在多个字段都要创建索引的情况下,联合索引由于单值索引 二.不适合创建索引 1.在where中使用不

  • mysql error 1071: 创建唯一索引时字段长度限制的问题

    目录 一.先描述一下问题吧 二.显而易见 三.问题和解决方案分析 一.先描述一下问题吧 如下创建表时候报错了 CREATE TABLE `xxx` (   `id` bigint(20) NOT NULL AUTO_INCREMENT,   `sys_code` varchar(255) DEFAULT NULL COMMENT '系统编码',   `module_name` varchar(1000) DEFAULT NULL COMMENT '模块名',   `call_num` bigin

  • mysql 中存在null和空时创建唯一索引的方法

    好多情况下数据库默认值都有null,但是经过程序处理很多时候会出现,数据库值为空而不是null的情况.此时创建唯一索引时要注意了,此时数据库会把空作为多个重复值,而创建索引失败,示例如下: 步骤1: mysql> select phone ,count(1) from User group by phone; +-----------------+----------+ | phone | count(1) | +-----------------+----------+ | NULL | 70

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

    目录 创建唯一索引时报错Duplicate entry * for key 场景 解决 MySQL唯一索引报错信息只显示前64位 1.数据准备 2.原因探索 创建唯一索引时报错Duplicate entry * for key 场景 在MySQL表创建唯一索引时,出现报错Duplicate entry * for key. 使用show index from table确认table中并不存在重名的唯一索引键名称. 解决 仔细看报错信息,根据那串ID数字,发现是表中出现违反创建的唯一索引键规则的

  • MySQL 死锁套路:唯一索引 S 锁与 X 锁的爱恨情仇

    在初学者从源码理解MySQL死锁问题中介绍了使用调试 MySQL  源码的方式来查看死锁的过程,这篇文章来讲讲一个常见的案例. 毫不夸张的说,有一半以上的死锁问题由唯一索引贡献,后面介绍的很多死锁的问题都跟唯一索引有关.这次我们讲一段唯一索引 S 锁与 X 锁的爱恨情仇 我们来看一个简化过的例子 # 构造数据 CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10), `level` int(11),

  • MySQL死锁套路之唯一索引下批量插入顺序不一致

    前言 死锁的本质是资源竞争,批量插入如果顺序不一致很容易导致死锁,我们来分析一下这个情况.为了方便演示,把批量插入改写为了多条 insert. 先来做几个小实验,简化的表结构如下 CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` varchar(5), `b` varchar(5), PRIMARY KEY (`id`), UNIQUE KEY `uk_name` (`a`,`b`) ); 实验1: 在记录不存在的情况下,

  • 详解MySQL的字段默认null对唯一索引的影响

    目录 正文 看一下为何唯一索引为影响insert速度 MySQL版本:在docker中启动一个mysql 假设只存在邮箱注册: insert数据 经验 正文 在日常业务开发中,会经常遇到需要保证唯一性的数据业务,如用户注册业务.一般注册业务中允许用户以手机号或email注册账号,且需要保证唯一,不允许重复注册.当用户输入手机号或email登录时,程序会判定输入信息的存在与否性,存在则走登录,不存在则走注册.而保证唯一性就不仅仅需要在程序端做判断,还需要MySQL的唯一索引去做最后一道防线.那么唯

  • MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇. 1.基础索引 在字段age 上创建索引,1(升序);-1(降序): db.users.ensureIndex({age:1}) _id 是创建表的时候自动创建的索引,此索引是不能够删除的.当

  • MySQL中的唯一索引的简单学习教程

    mysql 唯一索引UNIQUE一般用于不重复数据字段了我们经常会在数据表中的id设置为唯一索引UNIQUE,下面我来介绍如何在mysql中使用唯一索引UNIQUE吧. 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复.唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值.如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE. 把它定义为一个唯一索引. 创建表时直接设置: DROP TABLE IF EXISTS `st

  • mysql下普通索引和唯一索引的效率对比

    今天在我的虚拟机中布置了环境,测试抓图如下: 抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致相同,而且如果在一个列上同时建唯一索引和普通索引的话,mysql会自动选择唯一索引. 谷歌一下: 唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n). 补充下概念: 1.普通索引 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度.因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn

随机推荐