亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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ù)表示。
  • 默認(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)文章

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

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

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

    linux下如何使用yum源安裝mysql

    這篇文章主要介紹了linux下如何使用yum源安裝mysql問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    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ù)的隔離級(jí)別和MVCC、LBCC實(shí)現(xiàn)

    MySQL臟讀幻讀不可重復(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-07
  • MySQL數(shù)據(jù)庫(kù)配置信息查看與修改方法詳解

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

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

    MySQL自動(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
  • 優(yōu)化mysql的limit offset的例子

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

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

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

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

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

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

    CentOS系統(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

最新評(píng)論