当我尝试创建表时:
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字节。
有没有一种方法不需要改变数据类型就可以工作?
1条答案
按热度按时间fhg3lkii1#
两种解决方案
通过删除唯一约束
如果可以删除唯一约束。为搜索目的启用全文索引,但无法强制执行唯一约束。
通过规范化模式
把钥匙放好
varchar(255)
此表和存储中的列ids
从引用的表中。这些将是整数。对于整数,复合键可以正常工作。我认为mysql在将这个限制在3072字节方面做得很好。否则,人们会创建各种无用的索引,从而导致性能瓶颈。