2012-03-09 95 views
2

我正在使用一個將6位值存儲爲枚舉的mysql數據庫表。只有20個左右的值被指定,其餘的名稱像「type_30」。我現在正在更改列以使用alter TABLE table_name modify COLUMN column_name enum('text', ...);將一些描述性文本添加到某些值中。該表並不是那麼大(大約13e6行),但alter命令已運行了相當長一段時間。我有點驚訝,因爲看起來改變枚舉類型應該只需要修改表的元數據(所以表中的行數應該是不相關的)。更改mysql中的枚舉類型

爲什麼要改變枚舉類型中的行數這種類型的操作列專題?有沒有簡單的方法讓我快速更改枚舉的標籤?

回答

4

MySQL documentation

通過添加新 枚舉或組成員有效構件 值的列表的末尾,只要的存儲側改變一個ENUM的定義或SET柱數據類型不會更改。 例如,將成員添加到具有8個成員 的SET列,會將每個值所需的存儲空間從1個字節更改爲2個字節;這 將需要一個表副本。在列表 中添加成員會導致現有成員重新編號,這需要一個表副本。

枚舉以整數形式存儲。例如,如果你的枚舉是('是','否','是'將是1,'否'將是2.

在中間插入新項目需要重新編號,所以MySQL會創建一個新表格並複製行以更改數據。這不僅僅是對元數據的改變。

沒有快速的方法來改變現有的標籤,因爲它會影響數據。但是,如果僅將值添加到枚舉的末尾,則只需要更改元數據。

1

沒有簡單的方法來快速更改枚舉列的標籤。像你一樣運行MODIFY COLUMN是而不是更新標籤,它實際上是試圖重新映射所有現有數據以適應更新的枚舉值。如果運行alter TABLE table_name modify COLUMN column_name enum('red','yellow','blue');這將更新

1 = blue 
2 = red 
3 = yellow 

例如,如果你列在此之前爲ENUM(「藍」,「紅」,「黃」),您將有以下的索引值指數值如下:

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