欢迎观临
路漫漫其修远兮,吾将上下而求索

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也提供了一个解决办法:

`column: {unique:  ‘column’ }`

不要用unique: true!!!

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

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';

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

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控制台执行,就万事大吉啦。

赞(0) 打赏
未经允许不得转载:云海鹰影博客 » sequelize引起mysql错误:Too many keys specified. Max 64 keys allowed
分享到: 更多 (0)

欢迎留言 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1
    头像

    文章不错支持一下吧

    新闻头条2周前 (08-13)回复

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏