1. ホーム
  2. sql

[解決済み] MySQLでインデックスの名前を変更する方法

2023-03-23 21:44:30

質問

インデックスの名前を変更したい。 私は テーブルを変更する ドキュメントを見ましたが、単純にインデックスの名前を変更する構文がわかりません。 MySQL GUI からそれを行うと、インデックスが削除され、新しいインデックスが作成されます。 これは動作しますが、インデックスの名前を変更するためだけにインデックス全体を再構築することは避けたいと思います。

[追加情報]。

alter tableのドキュメントには、次のように書かれています。

テーブルのデータではなく、テーブルのメタデータのみを修正する変更 メタデータのみを変更し、テーブルのデータを変更しない変更は テーブルの.frmファイルを変更することで、すぐに行うことができます。 テーブルの.frm ファイルを変更することで、テーブルのデータではなく、テーブルのメタデータのみを変更することができます。 を変更することで直ちに行うことができます。次のような変更は は、この方法ですぐにできる変更です。 この方法で行うことができます。

* Renaming a column or index.

しかし、(テスト データベース上で).frm ファイルを編集してインデックスの名前を変更し、サーバーを再起動しようとしたところ、列を一覧表示しようとすると UI で "Could not fetch columns" となり、クエリを実行しようとすると "Unknown table engine ''" というエラーが返されるようになっています。 .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 INDEX コマンドはありません。 できるのは DROP INDEX で、次に CREATE INDEX を新しい名前に置き換えてください。


上記の更新について: おそらく、ドキュメントは十分に正確ではありません。 いずれにせよ、インデックスの名前を変更する SQL 構文はありません。

インデックスはデータから再構築できるデータ構造です(実際、インデックスを定期的に再構築するために OPTIMIZE TABLE ). 多少時間はかかりますが、当たり前の操作です。 インデックスのデータ構造はテーブルデータとは別物なので、ドキュメントにあるように、インデックスの追加や削除はテーブルデータを触る必要はないはずです。

については .frm ファイルの編集は MySQL ではサポートされていません。 .frm ファイルの編集をサポートしていません。 どんな理由であれ、私はそれを行いません。 テーブルを破損し、使用できなくなることが 100%保証されています。