更改mysql中的枚举类型
我正在使用一个mysql数据库表,它将一个6位的值存储为一个枚举。只指定了20个左右的值,其余值的名称类似于“type_30”。我现在使用更改mysql中的枚举类型,mysql,Mysql,我正在使用一个mysql数据库表,它将一个6位的值存储为一个枚举。只指定了20个左右的值,其余值的名称类似于“type_30”。我现在使用altertable TABLE\u name modify column column\u name enum('text',…)更改列以向某些值添加描述性文本表不是那么大(大约13e6行),但是alter命令已经运行了相当长的一段时间了。我有点惊讶,因为更改枚举类型似乎只需要修改表的元数据(因此表中的行数应该是无关的) 为什么列中的行数对这种类型的操作很重
altertable TABLE\u name modify column column\u name enum('text',…)更改列以向某些值添加描述性文本代码>表不是那么大(大约13e6行),但是alter命令已经运行了相当长的一段时间了。我有点惊讶,因为更改枚举类型似乎只需要修改表的元数据(因此表中的行数应该是无关的)
为什么列中的行数对这种类型的操作很重要?是否有一种简单的方法可以快速更改枚举的标签?从:
通过添加新属性更改枚举或集合列的定义
枚举或将成员设置为有效成员列表的末尾
值,只要数据类型的存储端不变。
例如,将成员添加到具有8个成员的集合列中
将每个值所需的存储从1字节更改为2字节;这
需要一份表格副本。在列表中间添加成员
导致对现有成员重新编号,这需要表副本
枚举存储为整数。例如,如果枚举是('yes','no','yes'将是1,'no'将是2
在中间插入新项需要重新编号,因此MySQL将创建一个新表并复制行以更改数据。这不仅仅是对元数据的更改
没有快速更改现有标签的方法,因为它会影响数据。但是,如果只向枚举的末尾添加值,则只需要更改元数据。没有简单的方法可以快速更改枚举列的标签。像以前一样运行“修改列”并不是更新标签,它实际上是尝试重新映射所有现有数据以适应更新的枚举值
例如,如果您的列之前是ENUM('blue'、'red'、'yellow'),则您将具有以下索引值:
1 = blue
2 = red
3 = yellow
1 -> 3
2 -> 1
3 -> 2
如果运行altertable\u name修改COLUMN\u name enum('red','yellow','blue')代码>它将更新索引值,如下所示:
1 = red
2 = yellow
3 = blue
这就是你想要的。但它也会返回并更新表的所有现有行,以重新映射索引值:
1 = blue
2 = red
3 = yellow
1 -> 3
2 -> 1
3 -> 2
你不想要的
如果只想更新标签而不修改现有行数据,则需要修改FRM文件。这里有一个关于如何做到这一点的描述: