Sequelize操作Mysql遇报错:Error: Too many keys; max 64 keys allowed

1,607 阅读1分钟

背景

最近在使用Sequelize操作Mysql的时候突然报标题上描述的错误,经过一番资料查证,总结一下错误出现的原因,以及解决方法。

问题

在创建模型的时候给某个非主键的字段设置了unique: true属性,原本相安无事,后来控制台突然报如下图错误:

Snipaste_2022-01-11_11-57-05.png 重点就是这句:Error: Too many keys; max 64 keys allowed

InnoDB存储引擎限制一张表最大只能包含64个次索引(官方文档)

再查看githubSequelize官方仓库Issue #12889,有人提了这个bug:

Snipaste_2022-01-13_22-55-26.png

当使用sequelize.sync({ alter: true })时,如果给非主键字段设置unique: true时,每次执行sequelize.sync({ alter: true })时,都会创建一个新的索引,命名依次indexName_2, indexName_3 ...,查看数据库索引列表,确实如此:

Snipaste_2022-01-11_11-28-00.png

解决方法

1 设置 column.unique: string (不要设置为true)

Sequelize官方文档对attributes.column.unique解释如下:

Snipaste_2022-01-13_23-08-16.pngattributes.column.unique设置为true时,该列就会成为一个唯一约束,如果设置为字符串,该列就会成为联合唯一索引的一部分,如果多列设置为相同的字符串,这些列将会成为这个相同唯一索引的一部分。按照官方文档的描述,设置为true时所表现出来的应该算是一个bug了。

2 设置 options.indexes

通过设置options.indexes也能够解决,如下:

const User = sequelize.define('User', { /* attributes */ }, {
    indexes: [
        {
            fields: ['email']
        },
        {
            fields: ['phone']
        }
    ]
})