如何在MySQL中重命名索引

Kib*_*bee 76 mysql sql indexing

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

[附加信息]

在alter table文档中,它说明了

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

* Renaming a column or index.
Run Code Online (Sandbox Code Playgroud)

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

Bil*_*win 132

我在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%保证会破坏您的桌子并使其无法使用.


  • 琐事:SQL标准对索引一无所知!这纯粹是与优化相关的供应商实现问题,因此与索引相关的所有语法都是专有的,在SQL数据库的所有品牌中都是如此. (18认同)

joe*_*son 52

对于MySQL 5.7:

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name
Run Code Online (Sandbox Code Playgroud)

对于MySQL旧版本:

ALTER TABLE tbl_name DROP INDEX old_index_name, ADD INDEX new_index_name (...)
Run Code Online (Sandbox Code Playgroud)

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

  • 小心删除并添加新索引,如果它是一个大表,它可能需要很长时间.在大桌面上执行此操作的一个好方法是使用pt-online-schema-change:http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html (9认同)

Ife*_*kwo 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;
Run Code Online (Sandbox Code Playgroud)

希望有人觉得这很有用。

  • 这接缝很糟糕,你不能在删除和添加时切换顺序吗?并保持检查活跃?`ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name` (7认同)