mysql错误1071(42000):指定的密钥太长;最大密钥长度为3072字节

7bsow1i6  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(340)

当我尝试创建表时:

CREATE TABLE `oro_workflow_restriction` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `workflow_step_id` int(11) DEFAULT NULL,
  `workflow_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `attribute` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `field` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `entity_class` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `mode` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `mode_values` longtext COLLATE utf8mb4_unicode_ci COMMENT '(DC2Type:json_array)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `oro_workflow_restriction_idx` (`workflow_name`,`workflow_step_id`,`field`,`entity_class`,`mode`),
  KEY `IDX_3D2C17E271FE882C` (`workflow_step_id`),
  KEY `IDX_3D2C17E21BBC6E3D` (`workflow_name`),
  CONSTRAINT `FK_3D2C17E21BBC6E3D` FOREIGN KEY (`workflow_name`) REFERENCES `oro_workflow_definition` (`name`) ON DELETE CASCADE,
  CONSTRAINT `FK_3D2C17E271FE882C` FOREIGN KEY (`workflow_step_id`) REFERENCES `oro_workflow_step` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

我得到一个关于指定密钥太长的错误;最大密钥长度为3072字节。
我不明白为什么会出错。最长的密钥长度是唯一密钥:4+42553=3071字节<3072字节(如果我的计算是正确的)
很明显 utf8mb4 是每个字符4个字节,我只能 varchar(191) 最大值。在我的例子中是4+42554=4084字节>3072字节。
有没有一种方法不需要改变数据类型就可以工作?

fhg3lkii

fhg3lkii1#

两种解决方案
通过删除唯一约束
如果可以删除唯一约束。为搜索目的启用全文索引,但无法强制执行唯一约束。
通过规范化模式
把钥匙放好 varchar(255) 此表和存储中的列 ids 从引用的表中。这些将是整数。对于整数,复合键可以正常工作。
我认为mysql在将这个限制在3072字节方面做得很好。否则,人们会创建各种无用的索引,从而导致性能瓶颈。

相关问题