web-dev-qa-db-ja.com

MySQLでインデックスの名前を変更する方法

インデックスの名前を変更したい。 alter table ドキュメンテーションを見てきましたが、単純にインデックスの名前を変更するための構文がわかりません。 MySQL GUIで実行すると、インデックスが削除され、新しいインデックスが作成されます。これは機能しますが、インデックスの名前を変更するためだけにインデックス全体を再構築することは避けたいと思います。

[追加情報]

変更テーブルのドキュメントでは、

テーブルのメタデータのみを変更し、テーブルデータを変更しない変更は、テーブルの.frmファイルを変更し、テーブルの内容を変更しないことにより、すぐに変更できます。次の変更は、この方法で行うことができる迅速な変更です。

* Renaming a column or index.

ただし、(テストデータベース上の).frmファイルを編集してサーバーを再起動することでインデックスの名前を変更しようとすると、列を一覧表示するとき、および実行しようとするときにUIで「列を取得できませんでした」と表示されるようになりましたクエリの場合、「Unknown table engine ''」というエラーが返されます。 .frmファイルには、多くのバイナリコンテンツが含まれています。バイナリ情報を編集するための優れたツールはありますか。

75
Kibbee

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%保証されています。


130
Bill Karwin

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 を参照してください

52

この質問は何年も前に尋ねられ、半年以上前に最後に更新されました。それでも、このヒントを追加する必要があると感じています。

インデックス付き列が外部キーとして他の場所で使用されている場合、それに関連するエラーが発生する可能性があります。これにより、次のことが可能になります。

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
Ifedi Okonkwo