[解決済み] MySQLでインデックスの名前を変更する方法
質問
インデックスの名前を変更したい。 私は テーブルを変更する ドキュメントを見ましたが、単純にインデックスの名前を変更する構文がわかりません。 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%保証されています。
関連
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] インデックスを指定してリストから要素を削除する方法
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] MySQLデータベースの名前を素早く変更する(スキーマ名を変更する)方法は?
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQL】1136 - 列数が1行目の値数と一致しない問題を解決
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] 指定されたスキーマにテーブルが存在するかどうかを確認する方法
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] SQL Serverでシングルクォートをエスケープするにはどうすればよいですか?
-
[解決済み] SQL JOIN - WHERE句とON句の比較
-
[解決済み] DISTINCTでCOUNT(*)を選択する
-
[解決済み] 既存のカラムにIDを追加する
-
[解決済み] SQL ServerでINSERT INTOとしてデータをエクスポートする
-
[解決済み] "ON UPDATE CASCADE "を使用する場合について