sequelize引起mysql错误:Too many keys specified. Max 64 keys allowed


一个项目中使用sequelize作为mysql的ORM,项目已经发布运行快一个月了,最近查看日志,发现了如标题中的mysql错误,让我感觉十分莫名其妙。进入mysql控制台一看,简直吓一跳,几乎所有的表都一堆的unique index,这还怎么玩!

赶紧想办法解决,一个个删肯定不可取,况且表的创建和修改都是sequelize自动执行的,你删了它再给你加。经过多方查找,发觉这是sequelize早已存在的一个BUG:如果用column: {unique: true},当执行sequelize.sync({alter: true})的时候,每次执行都会新加一个index (column, column_2, column_3, …), 蛋疼无比, sequelize官方也真够任性的,就是不改。

还好的是,sequelize也提供了一个解决办法:

1
`column: {unique:  ‘column’ }`

不要用unique: true!!!

已经创建的海量的unique索引怎么办?用下面的语句来配合删除:

1
2
SELECT CONCAT('ALTER TABLE ',i.TABLE_NAME,' DROP INDEX ',i.INDEX_NAME,' ;') 
FROM INFORMATION_SCHEMA.STATISTICS i WHERE TABLE_SCHEMA = '库名' AND i.INDEX_NAME <> 'PRIMARY';

上面的语句会输出指定的库中所有表的非主键索引的删除语句,如:

1
2
3
4
5
6
7
8
ALTER TABLE user DROP INDEX username ;
ALTER TABLE user DROP INDEX username_2 ;
ALTER TABLE user DROP INDEX username_3 ;
ALTER TABLE user DROP INDEX username_4 ;
ALTER TABLE user DROP INDEX username_5 ;
ALTER TABLE user DROP INDEX username_6 ;
ALTER TABLE user DROP INDEX username_7 ;
ALTER TABLE user DROP INDEX username_8 ;

将输出拷贝下来,过滤掉不需要删除的,将剩余的需要执行的语句拷贝到mysql控制台执行,就万事大吉啦。