如何修复“指定的键太多;最多允许 1 个键”错误?

问题描述 投票:0回答:2

我正在尝试将 MySQL 表的引擎从“innodb”更改为“archive”。我遇到了以下错误:

我在 stackoverflow 中寻找它但没有成功(我没有找到任何可用的答案)。知道如何解决这个问题吗?

mysql sql
2个回答
1
投票

您无法在 ARCHIVE 引擎中将 AUTO_INCRMENT 设置为特定值。所以只需去掉

auto_increment = 379
子句即可。

ARCHIVE 引擎不支持每个表有多个索引。您必须删除所有二级索引的 INDEX,最多留下一个索引。

事实上,我在 ARCHIVE 引擎中甚至没有使用过一个索引。我没有经常使用 ARCHIVE 引擎,不知道如何解决这个问题。

mysql> alter table t add key (x);
ERROR 1030 (HY000): Got error -1 from storage engine

在文档中找到它有点困难,但我确实找到了参考资料,表明 ARCHIVE 存储引擎根本不支持索引,即使您收到的错误表明它支持 1 个索引。

https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html 说:

存档:这些紧凑的、无索引表...

https://dev.mysql.com/doc/refman/8.0/en/archive-storage-engine.html 说:

ARCHIVE 存储引擎生成专用表,以非常小的占用空间存储大量“未索引”数据。 AUTO_INCRMENT 列可以有唯一索引或非唯一索引。尝试在任何其他列上创建索引都会导致错误。

演示:

mysql> create table t ( x int auto_increment, key(x)) engine=archive; Query OK, 0 rows affected (0.03 sec)

如果您尝试对可为空的列建立索引,它也不起作用。

mysql> create table t ( x int, key(x)) engine=archive; ERROR 1121 (42000): Table handler doesn't support NULL in given index. Please change column 'x' to be NOT NULL or use another handler

您应该考虑为什么要使用 ARCHIVE 引擎。如果您想在更小的空间中存储数据,您可以使用带有 
ROW_FORMAT=COMPRESSED

的 InnoDB 吗?

    


0
投票

mysql> SHOW INDEX FROM <tableName>

然后删除不必要的索引。

mysql> DROP INDEX <indexName> ON <tableName>

© www.soinside.com 2019 - 2024. All rights reserved.