如何重新命名MySQL中的索引

我想重新命名一个索引。 我已经查看了alter table文档,但是我找不到简单地重命名索引的语法。 当通过MySQL GUI执行时,会删除索引,并创build一个新的索引。 虽然这工作,我想避免重build整个索引只是为了改变索引的名称。

[附加信息]

在alter table文档中说明

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

* Renaming a column or index. 

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

我在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 (...)

MySQL中没有ALTER INDEX命令。 您只能DROP INDEX ,然后使用新名称CREATE INDEX


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

索引是可以从数据重build的数据结构(事实上,build议使用OPTIMIZE TABLE定期重build索引)。 这需要一些时间,但这是一个普通的操作。 索引数据结构与表数据是分开的,所以添加或删除索引不需要触摸表数据,正如文档所述。

关于.frm文件,MySQL不支持编辑.frm文件。 我不会因为任何原因去做。 你100%保证腐败你的桌子,使其无法使用。


对于MySQL 5.7:

 ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name 

对于MySQL旧版本:

 ALTER TABLE tbl_name DROP INDEX old_index_name, ADD INDEX new_index_name (...) 

请参阅http://dev.mysql.com/doc/refman/5.7/en/alter-table.html

这个问题在很久以前就被问过了,最近一次是在半年前更新的。 我仍然觉得有必要添加这个提示:

如果索引列在其他地方用作外键,则可能会遇到与此相关的错误。 这样做可能有所帮助:

 SET FOREIGN_KEY_CHECKS = 0; ALTER TABLE tbl DROP INDEX index_name; ALTER TABLE tbl ADD INDEX new_index_name (indexed_column); SET FOREIGN_KEY_CHECKS = 1; 

希望有人认为这有用。

对于Oracle 11g (至less)是这样的:

 ALTER INDEX upper_ix RENAME TO upper_name_ix;