当前位置: 首页 > 面试题库 >

如何在MySQL中重命名索引

干永丰
2023-03-14
问题内容

我想重命名索引。我看过alter table文档,但无法弄清楚简单地重命名索引的语法。通过MySQL
GUI进行操作时,它将删除索引并创建一个新索引。在这种情况下,我希望避免仅为了更改索引名称而重建整个索引。

[附加信息]

在alter table文档中指出

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

* Renaming a column or index.

但是,当我尝试通过编辑.frm文件(在测试数据库上)并重新启动服务器来重命名索引时,它现在在尝试列出列并尝试运行时在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 (...)

ALTER INDEXMySQL中没有命令。您只能DROP INDEXCREATE INDEX使用新名称。

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

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

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



 类似资料:
  • 我正在尝试重命名数据库中表中的列。我已经试过了 我收到了一个错误回复,回复是-;请问这句话的正确语法是什么?谢谢

  • 问题内容: 我需要重命名集群中的几个索引(它们的名称必须更改,我不能使用alias)。 我看到没有支持的方法来执行此操作,我发现最接近的方法是重命名索引的目录,我在集群中尝试了此方法。 该集群有3台计算机,并且分片在每台计算机上复制。我关闭了上elasticsearch ,改名到并重新启动。 群集的状态为黄色,elasticsearch正在做一些魔术来恢复正确的状态。过了一段时间我最终 正在使用和

  • 我需要重命名集群中的多个索引(必须更改它们的名称,我不能使用别名)。 我看到没有支持的方法可以做到这一点,我找到的最接近的方法是重命名索引的目录,我在集群中尝试了这个方法。 集群有 3 台机器 、 和 ,每个机器上都复制了分片。我关闭了上的弹性搜索,将重命名为,然后重新启动。 集群的状态是黄色的,弹性搜索正在使用一些魔法来恢复正确的状态。过了一段时间,我最终得到了 可用且完全复制(我猜是从和恢复的

  • 问题内容: 在使用以下代码初始化时,我拼错了名称: 我实际上打算用名称创建环境。尝试将文件夹重命名为时,我发现这没有太大帮助。激活环境的名称仍重命名旧的。 我想知道如何重命名环境? 问题答案: 默认情况下,virtualenv不支持环境重命名。仅删除virtualenv目录并使用正确的名称创建一个新目录是更安全的。您可以通过以下方式做到这一点: 激活您的virtualenv: 创建当前安装的软件包