背景
最近在使用Sequelize操作Mysql的时候突然报标题上描述的错误,经过一番资料查证,总结一下错误出现的原因,以及解决方法。
问题
在创建模型的时候给某个非主键的字段设置了unique: true属性,原本相安无事,后来控制台突然报如下图错误:
重点就是这句:
Error: Too many keys; max 64 keys allowed
InnoDB存储引擎限制一张表最大只能包含64个次索引(官方文档)
再查看github上Sequelize官方仓库Issue #12889,有人提了这个bug:
当使用sequelize.sync({ alter: true })时,如果给非主键字段设置unique: true时,每次执行sequelize.sync({ alter: true })时,都会创建一个新的索引,命名依次indexName_2, indexName_3 ...,查看数据库索引列表,确实如此:
解决方法
1 设置 column.unique: string (不要设置为true)
Sequelize官方文档对attributes.column.unique解释如下:
当
attributes.column.unique设置为true时,该列就会成为一个唯一约束,如果设置为字符串,该列就会成为联合唯一索引的一部分,如果多列设置为相同的字符串,这些列将会成为这个相同唯一索引的一部分。按照官方文档的描述,设置为true时所表现出来的应该算是一个bug了。
2 设置 options.indexes
通过设置options.indexes也能够解决,如下:
const User = sequelize.define('User', { /* attributes */ }, {
indexes: [
{
fields: ['email']
},
{
fields: ['phone']
}
]
})