Mysql

我可以在不重新索引的情況下將 ENUM 值從小寫更改為 studlyCase 嗎?

  • March 17, 2017

我有幾個大表,每個表都有列舉(範例):

ENUM ('webmasters', 'stackexchange', 'stackoverflow')

文件說,返回值是 ENUM 定義的字母大小寫,所以我現在有一個問題,因為我需要 studlyCase 中的返回值:

ENUM ('webMasters', 'stackExchange', 'stackOverflow')

實際上,我只需要從定義的列舉值的大列表中更改一個值,而且表中還沒有具有該值的數據。如果它很重要 - 該值幾乎在列舉定義的末尾。

這些表非常大 - 數以千萬計的數據。所以這是我的問題 - 我可以更改表以便不會重新計算索引嗎?

列舉物理儲存在表中,該表有一個映射到列舉位置值的數字。

您可以修改列以更改列舉,並且不應該遇到儲存數據值的問題(安全總比後悔好 - 備份表以防萬一)。

列舉具有您可能沒有意識到的缺點。以下是討論列舉優點的 stackexchange.com 連結。

使用 ENUM 與整數類型的優缺點?

在這裡,我們創建一個包含一列列舉的表。

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