欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL數(shù)據(jù)庫中ENUM的用法是什么詳解

 更新時間:2025年06月28日 11:50:04   作者:Flying_Fish_Xuan  
ENUM是一個字符串對象,用于指定一組預(yù)定義的值,并可在創(chuàng)建表時使用,下面這篇文章主要介紹了MySQL數(shù)據(jù)庫中ENUM的用法是什么的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

MySQL 中 ENUM 的用法

ENUM 是 MySQL 中一種非常有用的列數(shù)據(jù)類型,它用于定義一個枚舉類型的字段。ENUM 數(shù)據(jù)類型允許字段的值從一個預(yù)定義的值集合中選擇,并且可以通過限制用戶輸入的方式,確保數(shù)據(jù)的一致性和完整性。

一、ENUM 的定義與語法

ENUM 是 “enumeration” 的縮寫,用于定義具有一組預(yù)定義值的字符串類型字段。每個 ENUM 類型的字段可以保存一個枚舉值列表中的值,且每個字段最多只能存儲其中的一個值。

定義 ENUM 類型字段的基本語法如下:

CREATE TABLE 表名 (
    字段名 ENUM('值1', '值2', ..., '值N') [NOT NULL | NULL] DEFAULT '默認值'
);

其中:

  • 字段名 是定義為 ENUM 類型的字段名稱。
  • '值1', '值2', ..., '值N' 是枚舉類型的可能值列表,每個值是一個字符串。
  • [NOT NULL | NULL] 指定字段是否允許 NULL 值。
  • DEFAULT 用于設(shè)置該字段的默認值。

例如:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    status ENUM('active', 'inactive', 'banned') NOT NULL DEFAULT 'active'
);

在這個例子中,status 是一個 ENUM 類型字段,允許的值為 'active'、'inactive' 和 'banned',并且該字段的默認值是 'active'。

二、ENUM 的特點

  • 存儲方式

    • ENUM 類型的值以整數(shù)形式存儲,而不是直接存儲為字符串。每個枚舉值在存儲時被映射為一個從 1 開始的整數(shù),例如 '值1' 對應(yīng) 1,'值2' 對應(yīng) 2,依此類推。這種存儲方式使得 ENUM 類型在空間占用上比較緊湊。
    • 存儲大小取決于枚舉值的數(shù)量:
      • 1 個或 2 個枚舉值:需要 1 個字節(jié)存儲。
      • 3 到 255 個枚舉值:需要 1 個字節(jié)存儲。
      • 256 到 65,535 個枚舉值:需要 2 個字節(jié)存儲。
  • 查詢時的表現(xiàn)

    • 在執(zhí)行查詢時,ENUM 字段返回的是字符串值,而不是存儲的整數(shù)。例如,如果字段的值是 'active',查詢結(jié)果中會返回 'active' 而不是其對應(yīng)的整數(shù)表示。
  • 默認值

    • 可以為 ENUM 類型字段指定一個默認值,如果插入數(shù)據(jù)時該字段未明確賦值,MySQL 會使用這個默認值。例如,在上面的例子中,如果在插入用戶記錄時不指定 status 字段的值,它將自動默認為 'active'

三、ENUM 的用法

1. 創(chuàng)建包含 ENUM 類型的表

如前所述,創(chuàng)建包含 ENUM 類型字段的表的方式比較簡單。以下是一個創(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
);

在這個例子中,category 字段只能存儲 'electronics'、'furniture'、'clothing' 或 'toys' 之一,插入或更新時如果試圖存入其他值,會報錯。

2. 插入 ENUM 數(shù)據(jù)

向包含 ENUM 字段的表插入數(shù)據(jù)時,只能插入預(yù)定義的值之一。以下是插入操作的例子:

INSERT INTO products (name, category) VALUES ('Laptop', 'electronics');
INSERT INTO products (name, category) VALUES ('Sofa', 'furniture');

如果嘗試插入一個不在 ENUM 列表中的值,例如:

INSERT INTO products (name, category) VALUES ('Hat', 'accessories');

MySQL 將拋出錯誤,提示該值無效:

ERROR 1265 (01000): Data truncated for column 'category' at row 1

3. 查詢 ENUM 數(shù)據(jù)

ENUM 類型字段的查詢和普通字段一樣,可以直接根據(jù)枚舉值進行查詢。例如:

SELECT * FROM products WHERE category = 'electronics';

該查詢會返回所有 category 為 'electronics' 的產(chǎn)品。

4. 更新 ENUM 數(shù)據(jù)

可以使用 UPDATE 語句更新 ENUM 字段的值。例如:

UPDATE products SET category = 'toys' WHERE id = 2;

該操作會將 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 列時,新的值必須包含現(xiàn)有的所有值,否則現(xiàn)有的數(shù)據(jù)可能無法匹配新的枚舉列表,導(dǎo)致數(shù)據(jù)不一致。

四、ENUM 的優(yōu)缺點

1. 優(yōu)點

  • 數(shù)據(jù)完整性ENUM 類型強制數(shù)據(jù)只能在預(yù)定義的列表中選擇,避免了存入非法值的情況。這對數(shù)據(jù)一致性和完整性有很大幫助,尤其是在用戶輸入不可控的情況下。
  • 存儲效率ENUM 值在 MySQL 中以整數(shù)形式存儲,空間占用非常少,尤其當枚舉值數(shù)量較少時,存儲效率高。
  • 代碼可讀性:使用 ENUM 可以使代碼和數(shù)據(jù)結(jié)構(gòu)更加清晰,程序員和維護人員可以從數(shù)據(jù)庫結(jié)構(gòu)中很容易地看到一個字段允許的值范圍,提升了代碼和數(shù)據(jù)庫表設(shè)計的可讀性。

2. 缺點

  • 擴展性差:一旦定義了 ENUM 類型,如果需要添加新的枚舉值,必須使用 ALTER TABLE 修改表結(jié)構(gòu)。對于大表來說,修改表結(jié)構(gòu)可能會影響性能。如果應(yīng)用需求中枚舉值的變化較頻繁,ENUM 類型可能不適合。
  • 限制性ENUM 類型只適用于值范圍固定且相對較小的字段。如果有更復(fù)雜的需求(例如支持多選),ENUM 不適合使用。
  • 查詢復(fù)雜性ENUM 的底層存儲為整數(shù),而查詢返回的是字符串。因此在一些情況下,特別是涉及數(shù)值比較時,可能會產(chǎn)生混淆。

五、ENUM 與其他數(shù)據(jù)類型的比較

ENUM 類型在處理一組固定值時非常有用,但與其他一些常見的數(shù)據(jù)類型相比,它有一些獨特的特點。

1. ENUM vs. VARCHAR

ENUM 和 VARCHAR 都可以用于存儲字符串,但它們有明顯的區(qū)別:

  • 數(shù)據(jù)完整性ENUM 強制字段的值只能在預(yù)定義的列表中選擇,而 VARCHAR 沒有這種約束,用戶可以輸入任意值。
  • 存儲效率ENUM 使用整數(shù)存儲,效率更高,而 VARCHAR 則根據(jù)字符串的實際長度動態(tài)分配存儲空間,可能會占用更多空間。

2. ENUM vs. SET

SET 是 MySQL 中的另一種特殊類型,允許字段保存多個預(yù)定義的值,而 ENUM 則限制為一個值。

  • 單值 vs. 多值ENUM 只能保存單個值,而 SET 允許保存多個值。
  • 適用場景:如果需要表示某個字段的多種狀態(tài)或多種屬性,使用 SET 更為合適;而如果字段僅有單一的狀態(tài)或?qū)傩裕?code>ENUM 更合適。

六、ENUM 的實際使用場景

  • 用戶狀態(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、shippeddelivered、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ù)庫設(shè)計中,有時需要保存性別信息,常見的選項為 '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ù)輸入,且具有較高的存儲效率。然而,ENUM 的擴展性較差,適用于值列表不經(jīng)常變化的場景。在設(shè)計數(shù)據(jù)庫時,需要根據(jù)實際需求權(quán)衡 ENUM 的優(yōu)缺點,合理使用。

到此這篇關(guān)于MySQL數(shù)據(jù)庫中ENUM的用法是什么的文章就介紹到這了,更多相關(guān)MySQL中ENUM用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql 8.0.11安裝配置方法圖文教程

    mysql 8.0.11安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 8.0.11安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • linux下如何使用yum源安裝mysql

    linux下如何使用yum源安裝mysql

    這篇文章主要介紹了linux下如何使用yum源安裝mysql問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程

    CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程

    這篇文章主要介紹了CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程,使用RedHat系的Linux系統(tǒng)為環(huán)境的都可以借鑒,需要的朋友可以參考下
    2015-12-12
  • MySQL臟讀幻讀不可重復(fù)讀及事務(wù)的隔離級別和MVCC、LBCC實現(xiàn)

    MySQL臟讀幻讀不可重復(fù)讀及事務(wù)的隔離級別和MVCC、LBCC實現(xiàn)

    這篇文章主要介紹了MySQL臟讀幻讀不可重復(fù)讀及事務(wù)的隔離級別和MVCC、LBCC實現(xiàn),事務(wù)A?按照查詢條件讀取某個范圍的記錄,其他事務(wù)又在該范圍內(nèi)出入了滿足條件的新記錄,當事務(wù)A再次讀取數(shù)據(jù)到時候我們發(fā)現(xiàn)多了滿足記錄的條數(shù)
    2022-07-07
  • MySQL數(shù)據(jù)庫配置信息查看與修改方法詳解

    MySQL數(shù)據(jù)庫配置信息查看與修改方法詳解

    我們通常把在項目中使用的常量收集在一個文件,這個文件就是配置文件,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫配置信息查看與修改的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • MySQL自動填充create_time和update_time的兩種方式

    MySQL自動填充create_time和update_time的兩種方式

    當我們創(chuàng)建業(yè)務(wù)表的時候 通常都需要設(shè)置create_time 和 update_time,下面這篇文章主要給大家介紹了關(guān)于MySQL自動填充createTime和updateTime的兩種方式,需要的朋友可以參考下
    2022-05-05
  • 優(yōu)化mysql的limit offset的例子

    優(yōu)化mysql的limit offset的例子

    在mysql中,通常使用limit做分頁,而且經(jīng)常會跟order by 連用。在order by 上加索引有時候是很有幫助的,不然系統(tǒng)會做很多的filesort
    2013-02-02
  • 詳解mysql中的字符集和校驗規(guī)則

    詳解mysql中的字符集和校驗規(guī)則

    這篇文章主要介紹了mysql中的字符集和校驗規(guī)則的相關(guān)資料,幫助大家更好的理解和學(xué)習MySQL,感興趣的朋友可以了解下
    2020-12-12
  • 區(qū)分MySQL中的空值(null)和空字符('''')

    區(qū)分MySQL中的空值(null)和空字符('''')

    這篇文章主要介紹了如何區(qū)分MySQL中的空值(null)和空字符(''),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • CentOS系統(tǒng)下如何設(shè)置mysql每天自動備份

    CentOS系統(tǒng)下如何設(shè)置mysql每天自動備份

    備份是容災(zāi)的基礎(chǔ),是指為防止系統(tǒng)出現(xiàn)操作失誤或系統(tǒng)故障導(dǎo)致數(shù)據(jù)丟失,而將全部或部分數(shù)據(jù)集合從應(yīng)用主機的硬盤或陣列復(fù)制到其它的存儲介質(zhì)的過程。本文將詳細介紹在CentOS系統(tǒng)下如何設(shè)置mysql每天自動備份,有需要的朋友們下面來一起看看吧。
    2016-10-10

最新評論