Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改mysql中的枚举类型_Mysql - Fatal编程技术网

更改mysql中的枚举类型

更改mysql中的枚举类型,mysql,Mysql,我正在使用一个mysql数据库表,它将一个6位的值存储为一个枚举。只指定了20个左右的值,其余值的名称类似于“type_30”。我现在使用altertable TABLE\u name modify column column\u name enum('text',…)更改列以向某些值添加描述性文本表不是那么大(大约13e6行),但是alter命令已经运行了相当长的一段时间了。我有点惊讶,因为更改枚举类型似乎只需要修改表的元数据(因此表中的行数应该是无关的) 为什么列中的行数对这种类型的操作很重

我正在使用一个mysql数据库表,它将一个6位的值存储为一个枚举。只指定了20个左右的值,其余值的名称类似于“type_30”。我现在使用
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文件。这里有一个关于如何做到这一点的描述: