mysql联合索引阻碍修改列数据类型:BLOB/TEXT column ‘name’ used in key specification without a key length
今天在项目中mysql表中有一个字段数据类型为varchar,长度不够需要换为text类型
当时表是已经存在的表,
CREATE TABLE `table_aaa` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`age` int DEFAULT NULL,
`role` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `index_cs` (`id`),
KEY `index_aa` (`name`,`age`,`role`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
就没看那么细就直接一条alter语句去执行,然后即报了以下错误:
alter table table_aaa modify column `name` text;
-- > 异常信息- BLOB/TEXT column 'name' used in key specification without a key length
当时就百度了一下说是text不能/不建议(也没搞太懂)做索引,原因是太长。(如果做索引就只会有当前值得前几个内容做索引 !!个人理解不要误导大家)文章地址:https://www.cnblogs.com/zhangjpn/p/6133793.html
那就第一想到的是删除他的联合索引:
-- 错误理解:当时看到这个语法就直接把列名放上去删除
DROP INDEX `name` ON table_aaa
-- > 异常信息 - Can't DROP 'name'; check that column/key exists
这样想不对吗?
然后就各种倒腾,最后看到了一篇文章:https://www.cnblogs.com/chuanzhang053/p/9485706.html 在他的操作过程的2.删除这个复合索引才明白 这个语句中index
后是联合索引的名称
而不是列名
-- 正确理解
drop index index_aa on table_aaa;
-- 删除操作成功
-- 注意:注意:注意:index_aa 不是列名 而是联合索引的名称
然后用alter语句直接给修改列的数据类型。
最后记得把删除掉的索引再加上去
ALTER table table_aaa add INDEX index_aa (`age`,`role`);