Mysql
我可以在不重新索引的情況下將 ENUM 值從小寫更改為 studlyCase 嗎?
我有幾個大表,每個表都有列舉(範例):
ENUM ('webmasters', 'stackexchange', 'stackoverflow')
文件說,返回值是 ENUM 定義的字母大小寫,所以我現在有一個問題,因為我需要 studlyCase 中的返回值:
ENUM ('webMasters', 'stackExchange', 'stackOverflow')
實際上,我只需要從定義的列舉值的大列表中更改一個值,而且表中還沒有具有該值的數據。如果它很重要 - 該值幾乎在列舉定義的末尾。
這些表非常大 - 數以千萬計的數據。所以這是我的問題 - 我可以更改表以便不會重新計算索引嗎?
列舉物理儲存在表中,該表有一個映射到列舉位置值的數字。
您可以修改列以更改列舉,並且不應該遇到儲存數據值的問題(安全總比後悔好 - 備份表以防萬一)。
列舉具有您可能沒有意識到的缺點。以下是討論列舉優點的 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)