我有几张大桌子,每个表中都有枚举(例如):
ENUM ('webmasters', 'stackexchange', 'stackoverflow')文档化说,返回值是ENUM定义的小写,所以我现在遇到了一个问题,因为我需要studlyCase中的返回值:
ENUM ('webMasters', 'stackExchange', 'stackOverflow')实际上,我只需要从定义的枚举值的大列表中更改一个值,而且该值的表中还没有数据。如果它是物质-这个值几乎在枚举定义的末尾。
这些表格非常庞大--数以千万计的数据。所以这是我的问题-我可以改变表,这样索引就不会被重新计算?
发布于 2017-03-17 20:24:00
枚举物理存储在表中,其中有一个数字,该数字映射到枚举的位置值。
您可以修改您的列以更改枚举,并且不应该遇到与存储的数据值有关的问题(安全总比抱歉好--为了以防万一,对表进行备份)。
枚举会带来一些您可能不知道的缺点。下面是一个讨论枚举优点的stackexchange.com链接。
在这里,我们创建一个带有一列枚举的表。
mysql> create table mathisr.test (c1 enum ('webmasters', 'stackexchange', 'stackoverflow'));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values (1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test;
+---------------+
| c1 |
+---------------+
| webmasters |
| stackexchange |
| stackoverflow |
+---------------+
3 rows in set (0.00 sec)注意,在修改列以用不同的大小写表示值后,枚举将显示新的值。
mysql> alter table test modify c1 enum ('webMasters', 'stackExchange', 'stackOverflow');
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from test;
+---------------+
| c1 |
+---------------+
| webMasters |
| stackExchange |
| stackOverflow |
+---------------+
3 rows in set (0.00 sec)下面的命令演示如何在枚举中添加值.
mysql mathisr> alter table test modify c1 ENUM ('webMasters', 'stackExchange', 'somethingNew', 'stackOverflow');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test;
+---------------+
| c1 |
+---------------+
| webMasters |
| stackExchange |
| stackOverflow |
+---------------+
3 rows in set (0.00 sec)当我们查看数据时,我们将看到MySQL实际上更改了存储的数字,以容纳插入到枚举中间的新值。采用新的价值将产生索引的影响。
mysql> alter table test modify c1 tinyint;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test;
+------+
| c1 |
+------+
| 1 |
| 2 |
| 4 |
+------+
3 rows in set (0.00 sec)https://dba.stackexchange.com/questions/167447
复制相似问题