如何在MySQL中重命名索引

102

我想重命名一个索引。我查看了alter table文档,但我无法找到简单重命名索引的语法。在通过MySQL GUI执行此操作时,它会删除索引并创建新的索引。虽然这很有效,但我想避免重新构建整个索引以仅更改索引名称。

[附加信息]

在alter table文档中指出:

只修改表元数据而不修改表数据的变动可以通过修改表的.frm文件而立即进行,而不需要触及表内容。以下更改是快速更改,可以通过这种方式进行:

* Renaming a column or index.
但是,当我尝试通过编辑.frm文件来重命名索引(在测试数据库上),并重新启动服务器时,当尝试列出列时,它现在在UI中显示“无法获取列”,并且当尝试运行查询时,它返回错误“未知表引擎''”。.frm文件具有大量二进制内容。是否有用于编辑二进制信息的好工具?
3个回答

179

我在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重命名一个索引。这是MySQL对标准SQL的扩展。表的内容保持不变。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%的可能破坏你的表并使其无法使用。



27
小知识:SQL 标准对于索引没有任何规定!这完全是与优化相关的供应商实现问题,因此所有与索引相关的语法都是专有的,在所有品牌的 SQL 数据库中都如此。 - Bill Karwin
1
是的,基本上就是这样发生的。甚至在不正确地编辑文件时导致了MySQL崩溃。将其标记为正确。理想情况下,您可以只重命名索引,因为它只是元数据,但看起来这种功能不存在。 - Kibbee

77

10
小心删除或添加新的索引,如果是大表可能需要很长时间。在大表上执行这个操作的一个好方法是使用pt-online-schema-change: http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html - jbrahy

5

这个问题很久以前就被提出来了,最近更新时间已经超过半年。

我仍然觉得有必要添加这个提示:

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

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;

希望有人会发现这个有用。

7
这看起来不太好,你能否只是交换一下删除和添加的顺序?并且保持检查活动状态?ALTER TABLE tbl ADD INDEX new_index_name (indexed_column),DROP INDEX index_name - Puggan Se
应该将这个作为独立的答案Puggan Se,因为在mysql 5.7之前,这是最有效/最安全的方法。 - xref
不确定索引会如何影响外键。你并没有改变数据,只是数据上的索引。 - gdbj
@gdbj 外键约束依赖于索引,因此我认为您无法删除被外键约束使用的索引。 - Charles Wood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接