繁体   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