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

时间:2018-10-16 17:01:07

标签: mysql

当我尝试创建表时:

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 + 4 * 255 * 3 = 3071字节<3072字节。 (如果我的计算正确)

很明显,utf8mb4是每个字符4个字节,我最多只能有varchar(191)。在我的情况下,它是4 + 4 * 255 * 4 = 4084字节> 3072字节。

有没有一种方法不需要更改数据类型即可使其正常工作?

1 个答案:

答案 0 :(得分:1)

两种解决方案

通过放弃唯一约束

如果可以删除唯一约束。启用全文索引以进行搜索,但您将无法强制执行唯一性约束。

通过标准化架构

<script>列从该表中移出并存储引用表中的jquery-modal。这些将是整数。对于整数,复合键也可以正常工作。

我认为MySQL很好地将其限制为3072个字节。否则,人们会创建各种无用的索引,从而导致性能瓶颈。