如何解决“指定了太多键;最多允许1个键”错误?

时间:2019-05-23 18:15:13

标签: mysql sql

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

enter image description here

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

1 个答案:

答案 0 :(得分:1)

您不能在ARCHIVE引擎中将AUTO_INCREMENT设置为特定值。因此,只需删除auto_increment = 379子句。

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

实际上,我在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_INCREMENT列可以具有唯一索引或非唯一索引。尝试在其他任何列上创建索引都会导致错误。

演示:

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引擎。如果您想在更少的空间中存储数据,可以将InnoDB与ROW_FORMAT=COMPRESSED一起使用吗?