我要重命名一个枚举值。根据文档枚举是一个
在表创建时列规范中显式枚举的允许值列表。
变表语法文档的MySQL声明:
在大多数情况下,ALTER会临时复制原始表。
然而,也有例外:
通过向有效成员值列表的末尾添加新枚举或SET成员来更改ENUM或set列的定义,只要数据类型的存储大小不更改。
或
重命名列。
对于这种异常,不需要创建临时表。因此,ALTER查询更快。
从上面的语句中,我得出结论,MySQL不需要创建一个临时表,只需重命名枚举的值。毕竟:值的对应(内部)数字表示保持不变。因此,即使是表中的值的赋值也不应受到影响。
我对预期的行为运行了一些测试查询:
mysql> CREATE TABLE `test` (`type` enum('foo','bar') NOT NULL DEFAULT 'foo');
Query OK, 0 rows affected (0.01 sec)
mysql> show global status where Variable_name = 'Created_tmp_tables';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| Created_tmp_tables | 253 |
+--------------------+-------+
1 row in set (0.00 sec)
mysql> ALTER TABLE test CHANGE `type` type enum('foo','baz') NOT NULL DEFAULT 'foo';
Query OK, 0 rows affected (0.01 sec)
mysql> show global status where Variable_name = 'Created_tmp_tables';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| Created_tmp_tables | 254 |
+--------------------+-------+
1 row in set (0.00 sec)Created_tmp_tables显示在更改过程中创建了一个临时表。
为什么MySQL会这样做呢?还是没有针对这类操作进行优化?
发布于 2022-06-09 16:41:25
我总是忘记它是如何工作的,偶尔也会有同样的问题,我很高兴你问了这个问题,并在你的问题中贴出了答案:)
通过添加新的枚举或将成员设置到有效成员值的列表的末尾来更改ENUM或SET列的定义
与更改ENUM值本身不同。
https://stackoverflow.com/questions/35289576
复制相似问题