簡體   English   中英

在MySQL中更改枚舉類型

[英]Changing an enum type in mysql

我正在使用將6位值存儲為枚舉的mysql數據庫表。 僅指定了20個左右的值,其余的名稱則類似“ type_30”。 我現在正在更改列,以使用alter TABLE table_name modify COLUMN column_name enum( 'text', ... );向某些值添加描述性文本alter TABLE table_name modify COLUMN column_name enum( 'text', ... ); 該表不是很大(大約13e6行),但是alter命令已經運行了一段時間。 我有點驚訝,因為似乎更改枚舉類型只需要修改表的元數據(因此表中的行數應該無關緊要)。

為什么列中的行數對這種類型的操作很重要? 我有一種簡單的方法可以快速更改枚舉的標簽嗎?

MySQL文檔

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

枚舉存儲為整數。 例如,如果您的枚舉是('yes','no),則'yes'將為1,而'no'將為2。

在中間插入新項目需要重新編號,因此MySQL將創建一個新表並復制行以更改數據。 這不僅僅是對元數據的更改。

由於會影響數據,因此無法快速更改現有標簽。 但是,如果僅將值添加到枚舉的末尾,則僅需要更改元數據。

沒有簡單的方法可以快速更改枚舉列的標簽。 像您一樣運行MODIFY COLUMN 並不更新標簽,它實際上是在嘗試重新映射所有現有數據以適合您更新的枚舉值。

例如,如果之前的列為ENUM('blue','red','yellow'),則將具有以下索引值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM