我想更新 RDS Mysql 中的 Enum 并向列添加值。我想更新同一张表中存在的大量数据。我假设在更新表的模式时,表被锁定,这显然涉及我的服务将关闭的停机时间。我的 MysqlServer 版本是 5.5.40。
但是当我向 Enum 添加一个值时,RDS Mysql 服务器是否足够智能,可以检测到它不需要扫描现有行并在执行简单查询时快速更新架构,而无需扫描所有现有行的值枚举列的?
我想更新 RDS Mysql 中的 Enum 并向列添加值。我想更新同一张表中存在的大量数据。我假设在更新表的模式时,表被锁定,这显然涉及我的服务将关闭的停机时间。我的 MysqlServer 版本是 5.5.40。
但是当我向 Enum 添加一个值时,RDS Mysql 服务器是否足够智能,可以检测到它不需要扫描现有行并在执行简单查询时快速更新架构,而无需扫描所有现有行的值枚举列的?
在 Mysql 5.5.46 上,我在现有列表中添加了一个新的 ENUM 值:
enum ('a','b','c','d')
至
enum ('a','b','c','d','e')
对于 500k 行,ALTER TABLE CHANGE [column] 花费了不到 1 秒的时间。
这似乎是错误:https : //bugs.mysql.com/bug.php?id=45567 它似乎已在 5.1.40、5.5.0 和 6.0.14 中修复
在 Mysql 5.6.33 上,我尝试过
enum ('a','b','c','d')
至
enum ('a','b','c','e','d')
并且 ALTER TABLE CHANGE [column] 没有将现有的 d 更新为 e,如下所述:https ://dba.stackexchange.com/questions/11484/is-it-possible-to-change-enum-lists/11485#11485
我找不到修复此错误的版本。
坏消息,你似乎不走运。
http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/
问题是更改 ENUM 列的成员列表会使用 ALTER TABLE 重新构造整个表,这可能会耗费资源和时间。如果您有 ENUM('red', 'blue', 'black') 但需要将其更改为 ENUM('red', 'blue', 'white'),MySQL 需要重建您的表并查看每条记录以检查现在无效的值“黑色”。MySQL 简直是愚蠢的,当你所做的只是在成员列表的末尾添加一个新值时,它甚至会这样做!(传闻将来会更好地处理附加 ENUM 成员列表,但我怀疑这是一个高优先级的功能。)