我想重命名一个索引。我查看了alter table文档,但我无法弄清楚简单地重命名索引的语法。通过MySQL GUI执行此操作时,它会删除索引,并创建一个新索引。虽然这有效,但我想避免重建整个索引只是为了更改索引的名称。
[其他信息]
在alter table文档中,它说明了
仅修改表格的更改 元数据而不是表数据可以 立即改变了 table的.frm文件而不是触摸 表内容。以下更改 是可以做出的快速改变 这样:
* Renaming a column or index.
但是,当我尝试通过编辑.frm文件(在测试数据库上)并重新启动服务器来重命名索引时,它现在在尝试列出列时在UI中指出“无法获取列”,以及何时尝试运行查询时,它返回错误“Unknown table engine''”。 .frm文件有很多二进制内容。是否有一个很好的工具来编辑二进制信息。
答案 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 (...)
答案 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;