如何在MySQL中重命名索引


80

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

[附加信息]

在alter table文档中指出

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

* Renaming a column or index.

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

Answers:


143

我在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%保证会损坏您的表并使它无法使用。



22
琐事:SQL标准对索引一无所知!这纯粹是与优化有关的供应商实现问题,因此与索引有关的所有语法在所有SQL数据库品牌中都是专有的。
Bill Karwin 09年

1
是的,那几乎就是发生了什么。错误地编辑文件时,甚至使MySQL崩溃。将此标记为正确。理想情况下,您可以重命名索引,因为它只是元数据,但从功能上看似乎不存在。
Kibbee

58

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


10
请小心删除和添加新索引,如果这是一个很大的表,则可能需要很长时间。一个伟大的方式做到这一点上一大桌是用PT-在线模式的变化:percona.com/doc/percona-toolkit/2.1/...
jbrahy

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;

希望有人觉得这有用。


5
这缝不好,难道您不可以只切换放下并添加订单吗?并保持检查活跃?ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name
Puggan Se 2015年

Puggan Se可能应该让它自己解决,因为它是5.7之前的mysql最有效/最安全的方法
xref

困惑FK将如何受到索引的影响。您没有更改数据,仅更改了数据的索引。
gdbj

@gdbj外键约束取决于索引,因此我认为您不能删除由外键约束使用的索引。
查尔斯·伍德

-2

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

ALTER INDEX upper_ix RENAME TO upper_name_ix;

使用此MySQL线程发布Oracle解决方案的道歉。这是因为Oracle并不存在我要寻找的问题,因此找到答案后回到这里回答我的问题。
另一个
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.