2012-03-09 22 views
2

私は列挙型として6ビットの値を格納するmysqlデータベーステーブルで作業しています。値が20程度しか指定されておらず、残りは "type_30"のような名前を持っています。 alter TABLE table_name modify COLUMN column_name enum('text', ...);テーブルがそれほど大きくはない(約13e6行)が、alterコマンドはかなりの時間実行されています。列挙型を変更するだけでテーブルのメタデータを変更する必要があるように見えるので、少し驚いています(テーブル内の行数は関係ありません)。mysqlの列挙型を変更する

なぜこのタイプの操作の列の問題?列挙型のラベルをすばやく変更する簡単な方法はありますか? MySQL documentationから

答えて

4

のストレージ側限り、有効なメンバー 値のリストの末尾に新しい 列挙または集合メンバーを追加することにより、ENUMの定義またはSET列を変更しますデータ型は変更されません。 たとえば、8つのメンバーを持つSET列にメンバーを追加すると、 値ごとに必要な記憶域が1バイトから2バイトに変更されます。この にはテーブルコピーが必要です。 のリストの中央にメンバーを追加すると、既存のメンバーの番号が変更されます。既存のメンバーには、テーブルコピーが必要です。

列挙型は整数として格納されます。たとえば、列挙型が( 'yes'、 'no')の場合、 'yes'は1になり、 'no'は2になります。

途中に新しい項目を挿入すると番号を変更する必要があるため、行をコピーしてデータを変更します。メタデータの変更だけではありません。

既存のラベルはデータに影響するため、すぐに変更することはできません。ただし、列挙の最後にのみ値を追加する場合は、メタデータの変更のみが必要です。

1

列挙型列のラベルを簡単に変更する簡単な方法はありません。あなたが行ったようにMODIFY COLUMNを実行すると、ではなくというラベルが更新されます。実際には、更新された列挙型の値に合わせて既存のデータをすべて再マップしようとしています。例えば

、その後、あなたは、次のインデックス値を持っているでしょう前に、カラムはENUM(、「青」「赤」、「黄」)だった場合:

1 = blue 
2 = red 
3 = yellow 

あなたがalter TABLE table_name modify COLUMN column_name enum('red','yellow','blue');を実行した場合、それは更新します次のようなインデックス値:

1 = red 
2 = yellow 
3 = blue 

これはどれですか。しかし、インデックスの値を再マップするために、テーブルの既存の行をすべて更新することもできます。

1 -> 3 
2 -> 1 
3 -> 2 

あなたは望ましくありません。

既存の行データを変更せずにラベルを更新するだけの場合は、FRMファイルを変更する必要があります。これを行う方法の説明は次のとおりです。

https://dba.stackexchange.com/questions/6547/can-i-rename-the-values-in-a-mysql-enum-column-in-one-query