Specified key was too long; max key length is 767 bytes

MySQL5.6中导入SQL报错:

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

SQL文件如下:

复制代码
CREATE TABLE `test_case` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `group_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '用例集id',
  `title` varchar(64) NOT NULL DEFAULT 'testcase' COMMENT '用例名称',
  `description` varchar(512) NOT NULL DEFAULT '' COMMENT '用例描述',
  `is_delete` int(11) NOT NULL DEFAULT '0' COMMENT '用例状态 0-正常 1-删除',
  `creator` varchar(20) NOT NULL DEFAULT '' COMMENT '用例创建人',
  `modifier` varchar(1000) NOT NULL DEFAULT '' COMMENT '用例修改人',
  `case_content` longtext CHARACTER SET utf8mb4,
  `gmt_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
  `gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `extra` varchar(256) NOT NULL DEFAULT '' COMMENT '扩展字段',
  `product_line_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '业务线id 默认0',
  `case_type` int(11) NOT NULL DEFAULT '0' COMMENT '0-需求用例,1-核心用例,2-冒烟用例',
  `module_node_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '模块节点id',
  `requirement_id` varchar(1000) NOT NULL DEFAULT '0' COMMENT '需求id',
  `smk_case_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '冒烟case的id',
  `channel` int(11) NOT NULL DEFAULT '0' COMMENT '渠道标志 现默认1',
  PRIMARY KEY (`id`),
  KEY `idx_productline_isdelete` (`product_line_id`,`is_delete`),
  KEY `idx_requirement_id` (`requirement_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2207 DEFAULT CHARSET=utf8 COMMENT='测试用例';
复制代码

错误原因:

如果启用了系统变量innodb_large_prefix(MySQL5.6默认是关闭的,MySQL 5.7默认开启),则对于使用DYNAMIC或COMPRESSED行格式的InnoDB表,索引键前缀限制为3072字节。如果禁用innodb_large_prefix,则对于任何行格式的表,索引键前缀限制为767字节。此报错就是指超出索引字节767的限制。

解决办法:

1 启用系统变量innodb_large_prefix

SHOW variables like 'innodb_large_prefix'; //检查一下数据库被限制了索引的大小
SET GLOBAL INNODB_LARGE_PREFIX = ON; //如果上面查询的值是off的话,执行该命令启用

2 修改系统变量innodb_file_format引擎格式类型为Barracuda

SHOW variables like 'innodb_file_format'; //查看当前innodb_file_format引擎格式类型
SET GLOBAL innodb_file_format = BARRACUDA; //修改当前引擎格式类型

3 ROW_FORMAT为DYNAMIC或COMPRESSED

修改SQL文件,增加ROW_FORMAT为DYNAMIC:

复制代码
CREATE TABLE `test_case` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `group_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '用例集id',
  `title` varchar(64) NOT NULL DEFAULT 'testcase' COMMENT '用例名称',
  `description` varchar(512) NOT NULL DEFAULT '' COMMENT '用例描述',
  `is_delete` int(11) NOT NULL DEFAULT '0' COMMENT '用例状态 0-正常 1-删除',
  `creator` varchar(20) NOT NULL DEFAULT '' COMMENT '用例创建人',
  `modifier` varchar(1000) NOT NULL DEFAULT '' COMMENT '用例修改人',
  `case_content` longtext CHARACTER SET utf8mb4,
  `gmt_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
  `gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `extra` varchar(256) NOT NULL DEFAULT '' COMMENT '扩展字段',
  `product_line_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '业务线id 默认0',
  `case_type` int(11) NOT NULL DEFAULT '0' COMMENT '0-需求用例,1-核心用例,2-冒烟用例',
  `module_node_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '模块节点id',
  `requirement_id` varchar(1000) NOT NULL DEFAULT '0' COMMENT '需求id',
  `smk_case_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '冒烟case的id',
  `channel` int(11) NOT NULL DEFAULT '0' COMMENT '渠道标志 现默认1',
  PRIMARY KEY (`id`),
  KEY `idx_productline_isdelete` (`product_line_id`,`is_delete`),
  KEY `idx_requirement_id` (`requirement_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2207 DEFAULT CHARSET=utf8 COMMENT='测试用例' row_format=dynamic;
复制代码

最后,重新执行SQL,导入成功。

posted @   ycyzharry  阅读(610)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示