MySQL數(shù)據(jù)庫(kù)中ENUM的用法是什么詳解
MySQL 中 ENUM 的用法
ENUM
是 MySQL 中一種非常有用的列數(shù)據(jù)類型,它用于定義一個(gè)枚舉類型的字段。ENUM
數(shù)據(jù)類型允許字段的值從一個(gè)預(yù)定義的值集合中選擇,并且可以通過限制用戶輸入的方式,確保數(shù)據(jù)的一致性和完整性。
一、ENUM 的定義與語法
ENUM
是 “enumeration” 的縮寫,用于定義具有一組預(yù)定義值的字符串類型字段。每個(gè) ENUM
類型的字段可以保存一個(gè)枚舉值列表中的值,且每個(gè)字段最多只能存儲(chǔ)其中的一個(gè)值。
定義 ENUM
類型字段的基本語法如下:
CREATE TABLE 表名 ( 字段名 ENUM('值1', '值2', ..., '值N') [NOT NULL | NULL] DEFAULT '默認(rèn)值' );
其中:
字段名
是定義為ENUM
類型的字段名稱。'值1', '值2', ..., '值N'
是枚舉類型的可能值列表,每個(gè)值是一個(gè)字符串。[NOT NULL | NULL]
指定字段是否允許NULL
值。DEFAULT
用于設(shè)置該字段的默認(rèn)值。
例如:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, status ENUM('active', 'inactive', 'banned') NOT NULL DEFAULT 'active' );
在這個(gè)例子中,status
是一個(gè) ENUM
類型字段,允許的值為 'active'
、'inactive'
和 'banned'
,并且該字段的默認(rèn)值是 'active'
。
二、ENUM 的特點(diǎn)
存儲(chǔ)方式:
ENUM
類型的值以整數(shù)形式存儲(chǔ),而不是直接存儲(chǔ)為字符串。每個(gè)枚舉值在存儲(chǔ)時(shí)被映射為一個(gè)從 1 開始的整數(shù),例如'值1'
對(duì)應(yīng)1
,'值2'
對(duì)應(yīng)2
,依此類推。這種存儲(chǔ)方式使得ENUM
類型在空間占用上比較緊湊。- 存儲(chǔ)大小取決于枚舉值的數(shù)量:
- 1 個(gè)或 2 個(gè)枚舉值:需要 1 個(gè)字節(jié)存儲(chǔ)。
- 3 到 255 個(gè)枚舉值:需要 1 個(gè)字節(jié)存儲(chǔ)。
- 256 到 65,535 個(gè)枚舉值:需要 2 個(gè)字節(jié)存儲(chǔ)。
查詢時(shí)的表現(xiàn):
- 在執(zhí)行查詢時(shí),
ENUM
字段返回的是字符串值,而不是存儲(chǔ)的整數(shù)。例如,如果字段的值是'active'
,查詢結(jié)果中會(huì)返回'active'
而不是其對(duì)應(yīng)的整數(shù)表示。
- 在執(zhí)行查詢時(shí),
默認(rèn)值:
- 可以為
ENUM
類型字段指定一個(gè)默認(rèn)值,如果插入數(shù)據(jù)時(shí)該字段未明確賦值,MySQL 會(huì)使用這個(gè)默認(rèn)值。例如,在上面的例子中,如果在插入用戶記錄時(shí)不指定status
字段的值,它將自動(dòng)默認(rèn)為'active'
。
- 可以為
三、ENUM 的用法
1. 創(chuàng)建包含 ENUM 類型的表
如前所述,創(chuàng)建包含 ENUM
類型字段的表的方式比較簡(jiǎn)單。以下是一個(gè)創(chuàng)建包含 ENUM
類型字段的例子:
CREATE TABLE products ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, category ENUM('electronics', 'furniture', 'clothing', 'toys') NOT NULL );
在這個(gè)例子中,category
字段只能存儲(chǔ) 'electronics'
、'furniture'
、'clothing'
或 'toys'
之一,插入或更新時(shí)如果試圖存入其他值,會(huì)報(bào)錯(cuò)。
2. 插入 ENUM 數(shù)據(jù)
向包含 ENUM
字段的表插入數(shù)據(jù)時(shí),只能插入預(yù)定義的值之一。以下是插入操作的例子:
INSERT INTO products (name, category) VALUES ('Laptop', 'electronics'); INSERT INTO products (name, category) VALUES ('Sofa', 'furniture');
如果嘗試插入一個(gè)不在 ENUM
列表中的值,例如:
INSERT INTO products (name, category) VALUES ('Hat', 'accessories');
MySQL 將拋出錯(cuò)誤,提示該值無效:
ERROR 1265 (01000): Data truncated for column 'category' at row 1
3. 查詢 ENUM 數(shù)據(jù)
ENUM
類型字段的查詢和普通字段一樣,可以直接根據(jù)枚舉值進(jìn)行查詢。例如:
SELECT * FROM products WHERE category = 'electronics';
該查詢會(huì)返回所有 category
為 'electronics'
的產(chǎn)品。
4. 更新 ENUM 數(shù)據(jù)
可以使用 UPDATE
語句更新 ENUM
字段的值。例如:
UPDATE products SET category = 'toys' WHERE id = 2;
該操作會(huì)將 id
為 2 的產(chǎn)品類別更改為 'toys'
。
5. 修改 ENUM 列的值列表
如果需要為現(xiàn)有的 ENUM
列添加或刪除值,可以使用 ALTER TABLE
語句。例如,向 category
列中添加新類別 'accessories'
:
ALTER TABLE products MODIFY category ENUM('electronics', 'furniture', 'clothing', 'toys', 'accessories');
需要注意的是,在修改 ENUM
列時(shí),新的值必須包含現(xiàn)有的所有值,否則現(xiàn)有的數(shù)據(jù)可能無法匹配新的枚舉列表,導(dǎo)致數(shù)據(jù)不一致。
四、ENUM 的優(yōu)缺點(diǎn)
1. 優(yōu)點(diǎn)
- 數(shù)據(jù)完整性:
ENUM
類型強(qiáng)制數(shù)據(jù)只能在預(yù)定義的列表中選擇,避免了存入非法值的情況。這對(duì)數(shù)據(jù)一致性和完整性有很大幫助,尤其是在用戶輸入不可控的情況下。 - 存儲(chǔ)效率:
ENUM
值在 MySQL 中以整數(shù)形式存儲(chǔ),空間占用非常少,尤其當(dāng)枚舉值數(shù)量較少時(shí),存儲(chǔ)效率高。 - 代碼可讀性:使用
ENUM
可以使代碼和數(shù)據(jù)結(jié)構(gòu)更加清晰,程序員和維護(hù)人員可以從數(shù)據(jù)庫(kù)結(jié)構(gòu)中很容易地看到一個(gè)字段允許的值范圍,提升了代碼和數(shù)據(jù)庫(kù)表設(shè)計(jì)的可讀性。
2. 缺點(diǎn)
- 擴(kuò)展性差:一旦定義了
ENUM
類型,如果需要添加新的枚舉值,必須使用ALTER TABLE
修改表結(jié)構(gòu)。對(duì)于大表來說,修改表結(jié)構(gòu)可能會(huì)影響性能。如果應(yīng)用需求中枚舉值的變化較頻繁,ENUM
類型可能不適合。 - 限制性:
ENUM
類型只適用于值范圍固定且相對(duì)較小的字段。如果有更復(fù)雜的需求(例如支持多選),ENUM
不適合使用。 - 查詢復(fù)雜性:
ENUM
的底層存儲(chǔ)為整數(shù),而查詢返回的是字符串。因此在一些情況下,特別是涉及數(shù)值比較時(shí),可能會(huì)產(chǎn)生混淆。
五、ENUM 與其他數(shù)據(jù)類型的比較
ENUM
類型在處理一組固定值時(shí)非常有用,但與其他一些常見的數(shù)據(jù)類型相比,它有一些獨(dú)特的特點(diǎn)。
1. ENUM vs. VARCHAR
ENUM
和 VARCHAR
都可以用于存儲(chǔ)字符串,但它們有明顯的區(qū)別:
- 數(shù)據(jù)完整性:
ENUM
強(qiáng)制字段的值只能在預(yù)定義的列表中選擇,而VARCHAR
沒有這種約束,用戶可以輸入任意值。 - 存儲(chǔ)效率:
ENUM
使用整數(shù)存儲(chǔ),效率更高,而VARCHAR
則根據(jù)字符串的實(shí)際長(zhǎng)度動(dòng)態(tài)分配存儲(chǔ)空間,可能會(huì)占用更多空間。
2. ENUM vs. SET
SET
是 MySQL 中的另一種特殊類型,允許字段保存多個(gè)預(yù)定義的值,而 ENUM
則限制為一個(gè)值。
- 單值 vs. 多值:
ENUM
只能保存單個(gè)值,而SET
允許保存多個(gè)值。 - 適用場(chǎng)景:如果需要表示某個(gè)字段的多種狀態(tài)或多種屬性,使用
SET
更為合適;而如果字段僅有單一的狀態(tài)或?qū)傩裕?code>ENUM 更合適。
六、ENUM 的實(shí)際使用場(chǎng)景
用戶狀態(tài):
ENUM
可以用于表示用戶的狀態(tài),如active
、inactive
、banned
。CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), status ENUM('active', 'inactive', 'banned') NOT NULL DEFAULT 'active' );
訂單狀態(tài):用于表示訂單的不同狀態(tài),如
pending
、shipped
、delivered
、canceled
。CREATE TABLE orders ( id INT AUTO_INCREMENT PRIMARY KEY, product_id INT, status ENUM('pending', 'shipped', 'delivered', 'canceled') NOT NULL DEFAULT 'pending' );
**性
別字段**:在數(shù)據(jù)庫(kù)設(shè)計(jì)中,有時(shí)需要保存性別信息,常見的選項(xiàng)為 'male'
和 'female'
,可以使用 ENUM
來定義。
CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), gender ENUM('male', 'female') NOT NULL );
七、總結(jié)
MySQL 中的 ENUM
數(shù)據(jù)類型適用于定義有限的、預(yù)定義的值集合,它可以有效地確保數(shù)據(jù)一致性,減少非法數(shù)據(jù)輸入,且具有較高的存儲(chǔ)效率。然而,ENUM
的擴(kuò)展性較差,適用于值列表不經(jīng)常變化的場(chǎng)景。在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),需要根據(jù)實(shí)際需求權(quán)衡 ENUM
的優(yōu)缺點(diǎn),合理使用。
到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)中ENUM的用法是什么的文章就介紹到這了,更多相關(guān)MySQL中ENUM用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程
這篇文章主要介紹了CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程,使用RedHat系的Linux系統(tǒng)為環(huán)境的都可以借鑒,需要的朋友可以參考下2015-12-12MySQL臟讀幻讀不可重復(fù)讀及事務(wù)的隔離級(jí)別和MVCC、LBCC實(shí)現(xiàn)
這篇文章主要介紹了MySQL臟讀幻讀不可重復(fù)讀及事務(wù)的隔離級(jí)別和MVCC、LBCC實(shí)現(xiàn),事務(wù)A?按照查詢條件讀取某個(gè)范圍的記錄,其他事務(wù)又在該范圍內(nèi)出入了滿足條件的新記錄,當(dāng)事務(wù)A再次讀取數(shù)據(jù)到時(shí)候我們發(fā)現(xiàn)多了滿足記錄的條數(shù)2022-07-07MySQL數(shù)據(jù)庫(kù)配置信息查看與修改方法詳解
我們通常把在項(xiàng)目中使用的常量收集在一個(gè)文件,這個(gè)文件就是配置文件,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)配置信息查看與修改的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06MySQL自動(dòng)填充create_time和update_time的兩種方式
當(dāng)我們創(chuàng)建業(yè)務(wù)表的時(shí)候 通常都需要設(shè)置create_time 和 update_time,下面這篇文章主要給大家介紹了關(guān)于MySQL自動(dòng)填充createTime和updateTime的兩種方式,需要的朋友可以參考下2022-05-05區(qū)分MySQL中的空值(null)和空字符('''')
這篇文章主要介紹了如何區(qū)分MySQL中的空值(null)和空字符(''),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-09-09CentOS系統(tǒng)下如何設(shè)置mysql每天自動(dòng)備份
備份是容災(zāi)的基礎(chǔ),是指為防止系統(tǒng)出現(xiàn)操作失誤或系統(tǒng)故障導(dǎo)致數(shù)據(jù)丟失,而將全部或部分?jǐn)?shù)據(jù)集合從應(yīng)用主機(jī)的硬盤或陣列復(fù)制到其它的存儲(chǔ)介質(zhì)的過程。本文將詳細(xì)介紹在CentOS系統(tǒng)下如何設(shè)置mysql每天自動(dòng)備份,有需要的朋友們下面來一起看看吧。2016-10-10