我正在尝试将 MySQL 表的引擎从“innodb”更改为“archive”。我遇到了以下错误:
我在 stackoverflow 中寻找它但没有成功(我没有找到任何可用的答案)。知道如何解决这个问题吗?
您无法在 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 吗?
mysql> SHOW INDEX FROM <tableName>
然后删除不必要的索引。
mysql> DROP INDEX <indexName> ON <tableName>