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,导入成功。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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语句:使用策略模式优化代码结构