MySQLでインデックスの名前を変更するにはどうすればよいですか


82

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

[追加情報]

表の変更のドキュメントには、

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

* Renaming a column or index.

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

回答:


144

私は2009年にこの質問に答えました。当時、MySQLにはインデックスの名前を変更する構文がありませんでした。

それ以来、MySQL5.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%保証されています。



22
雑学クイズ:SQL標準はインデックスについて何も述べていません!これは純粋に最適化に関連するベンダー実装の問題であるため、インデックスに関連するすべての構文は、すべてのブランドのSQLデータベースで独自のものです。
ビルカーウィン

1
ええ、それはほとんど起こったことです。ファイルを誤って編集すると、MySQLがクラッシュすることさえありました。これを正しいものとしてマークします。インデックスは単なるメタデータであるため、名前を変更するのが理想的ですが、機能的には存在しないようです。
Kibbee 2009

60

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


10
新しいインデックスの削除と追加には注意してください。大きなテーブルの場合、時間がかかる可能性があります。大きなテーブルの上にそれを行うための素晴らしい方法は、PT-オンライン・スキーマ変更を使用することです:percona.com/doc/percona-toolkit/2.1/...
jbrahy

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;

誰かがこれが役に立つと思うことを願っています。


5
これは悪い継ぎ目です、あなたはただドロップで順序を切り替えて追加することができませんでしたか?チェックをアクティブに保ちますか?ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name
Puggan Se 2015

5.7より前のmysqlにとって最も効率的で安全な方法であるため、おそらくこれは独自の答えであるPuggan Seにする必要があります
外部参照2016年

FKがインデックスによってどのように影響を受けるか混乱しました。データを変更するのではなく、データのインデックスのみを変更します。
gdbj

@gdbj外部キー制約はインデックスに依存しているため、外部キー制約で使用されているインデックスを削除することはできないと思います。
チャールズウッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.