当我尝试创建表时:
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字节。
有没有一种方法不需要更改数据类型即可使其正常工作?
答案 0 :(得分:1)
两种解决方案
通过放弃唯一约束
如果可以删除唯一约束。启用全文索引以进行搜索,但您将无法强制执行唯一性约束。
通过标准化架构
将<script>
列从该表中移出并存储引用表中的jquery-modal
。这些将是整数。对于整数,复合键也可以正常工作。
我认为MySQL很好地将其限制为3072个字节。否则,人们会创建各种无用的索引,从而导致性能瓶颈。