Kib*_*bee 76 mysql sql indexing
我想重命名一个索引.我查看了alter table文档,但我无法弄清楚简单地重命名索引的语法.通过MySQL GUI执行此操作时,它会删除索引,并创建一个新索引.虽然这有效,但我想避免重建整个索引只是为了更改索引的名称.
[附加信息]
在alter table文档中,它说明了
通过更改表的.frm文件而不是触摸表内容,可以立即修改仅修改表元数据而不是表数据的更改.以下更改是可以通过这种方式进行的快速更改:
Run Code Online (Sandbox Code Playgroud)* Renaming a column or index.
但是,当我尝试通过编辑.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 INDEX再CREATE INDEX使用新名称.
关于上面的更新:可能文档不够精确.无论如何,没有SQL语法来重命名索引.
索引是可以从数据重建的数据结构(实际上建议定期重建索引OPTIMIZE TABLE).这需要一些时间,但这是一种常见的操作.索引数据结构与表数据是分开的,因此添加或删除索引不需要触及表数据,正如文档所述.
关于该.frm文件,MySQL不支持编辑该.frm文件.我不会出于任何原因这样做.您100%保证会破坏您的桌子并使其无法使用.
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
这个问题很久以前就被问过,最后一次更新是在半年前。我仍然觉得有必要添加这个提示:
如果索引列在其他地方用作外键,您可能会遇到与此相关的错误。这样做可能会有所帮助:
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)
希望有人觉得这很有用。
| 归档时间: |
|
| 查看次数: |
60334 次 |
| 最近记录: |