如何在MySQL中重命名索引

时间:2009-09-23 00:36:38

标签: sql mysql indexing

我想重命名一个索引。我查看了alter table文档,但我无法弄清楚简单地重命名索引的语法。通过MySQL GUI执行此操作时,它会删除索引,并创建一个新索引。虽然这有效,但我想避免重建整个索引只是为了更改索引的名称。

[其他信息]

在alter table文档中,它说明了

  

仅修改表格的更改   元数据而不是表数据可以   立即改变了   table的.frm文件而不是触摸   表内容。以下更改   是可以做出的快速改变   这样:

* Renaming a column or index.

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

4 个答案:

答案 0 :(得分:125)

我在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语法来重命名索引。

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

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


答案 1 :(得分:52)

对于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

答案 2 :(得分:3)

很久以前就提出过这个问题,并且是在半年前的最后一次更新。 我还是觉得有必要添加这个提示:

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

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;

希望有人觉得这很有用。

答案 3 :(得分:-2)

对于Oracle 11g(至少),它是这样的:

ALTER INDEX upper_ix RENAME TO upper_name_ix;