为什么MySQL会创建用于重命名枚举值的临时表?

时间:2016-02-09 10:27:04

标签: mysql enums alter-table

我面临着重命名枚举值的价值。根据{{​​3}}枚举是

  

在创建表时在列规范中显式枚举的允许值列表。

MySQL的documentation文档声明:

  

在大多数情况下,ALTER TABLE会生成原始表的临时副本。

但也有例外:

  

通过添加新枚举或将成员设置到有效成员值列表的末尾来更改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的行为是否有这样的原因?或者它只是没有针对这种操作进行优化?

0 个答案:

没有答案