一个项目中使用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 | SELECT CONCAT('ALTER TABLE ',i.TABLE_NAME,' DROP INDEX ',i.INDEX_NAME,' ;') |
上面的语句会输出指定的库中所有表的非主键索引的删除语句,如:
1 | ALTER TABLE user DROP INDEX username ; |
将输出拷贝下来,过滤掉不需要删除的,将剩余的需要执行的语句拷贝到mysql控制台执行,就万事大吉啦。