一尘不染

如何在MySQL中重命名索引

mysql

我想重命名索引。我看过alter table文档,但无法弄清楚简单地重命名索引的语法。通过MySQL
GUI进行操作时,它将删除索引并创建一个新索引。在这种情况下,我希望避免仅为了更改索引名称而重建整个索引。

[附加信息]

在alter table文档中指出

可以通过更改表的.frm文件而不接触表内容来立即进行仅修改表元数据而不修改表数据的更改。以下更改是可以通过这种方式进行的快速更改:

* Renaming a column or index.

但是,当我尝试通过编辑.frm文件(在测试数据库上)并重新启动服务器来重命名索引时,它现在在尝试列出列并尝试运行时在UI中指出“无法获取列”查询,它将返回错误“未知表引擎”。.frm文件包含很多二进制内容。是否有一个用于编辑二进制信息的好工具。


阅读 1051

收藏
2020-05-17

共1个答案

一尘不染

我在2009年回答了这个问题。当时MySQL中没有语法可用来重命名索引。

从那时起,MySQL 5.7引入了一种ALTER TABLE RENAME INDEX语法。

http://dev.mysql.com/doc/refman/5.7/en/alter-
table.html部分说:

  • RENAME INDEX old_index_name TO new_index_name重命名索引。这是标准SQL的MySQL扩展。该表的内容保持不变。old_index_name必须是同一ALTER TABLE语句未删除的表中现有索引的名称。new_index_name是新的索引名称,在应用更改后,该名称不能与结果表中的索引名称重复。两个索引名称都不能为PRIMARY

MySQL的早期版本(例如5.6和更早版本)不支持使用语法ALTER TABLE重命名索引(或键,这是同义词)。

唯一的解决方案是ALTER TABLE DROP KEY oldkeyname, ADD KEY newkeyname (...)

ALTER INDEXMySQL中没有命令。您只能DROP INDEXCREATE INDEX使用新名称。


关于以上更新:也许文档不够精确。无论如何,没有SQL语法可以重命名索引。

索引是可以从数据中重建的数据结构(实际上,建议使用定期重建索引OPTIMIZE TABLE)。这需要一些时间,但这是司空见惯的操作。索引数据结构与表数据是分开的,因此,如文档所述,添加或删除索引不需要接触表数据。

关于.frm文件,MySQL不支持编辑.frm文件。出于任何原因我都不会这样做。您100%保证会损坏您的表并使它无法使用。


2020-05-17