MySQL中ENUM
时间: 2024-12-30 22:25:42 浏览: 22
### MySQL ENUM 类型使用说明
#### 创建带有 ENUM 列的数据表
在 MySQL 中,`ENUM` 是一种特殊的字符串对象,其值来自一组预先定义好的字符串列表。创建包含 `ENUM` 列的表格时,需指定允许存储的具体值。
```sql
CREATE TABLE shirts (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
size ENUM('S','M','L','XL','XXL') -- 定义枚举类型的列
);
```
此命令会建立一张名为 `shirts` 的新表,并设置一列为 `size` ,它只接受 `'S'`, `'M'`, `'L'`, `'XL'`, 或者 `'XXL'` 这几个特定字符作为输入[^1]。
#### 插入数据到 ENUM 列
当向具有 `ENUM` 字段的表中插入记录时,所给定的值应当匹配已声明过的选项之一;如果不符,则默认采用第一个成员项填充该位置。
```sql
INSERT INTO shirts (name, size) VALUES ('Crew Neck T-Shirt', 'M');
INSERT INTO shirts (name, size) VALUES ('Hoodie Sweatshirt', 'XL');
```
如果尝试插入不在预设范围内的值:
```sql
INSERT INTO shirts (name, size) VALUES ('V-Neck Shirt', 'XS'); -- 错误操作
```
这将会引发错误提示,因为 `'XS'` 并不属于之前设定的有效尺寸集合内[^5]。
#### 查询 ENUM 值及其索引编号
除了按名称访问外,还可以通过内部整数索引来引用这些枚举常量。例如,在上述例子中的 `"S"` 对应于数值 1 而不是实际的文字串 "S" 。可以通过如下方式查看具体的映射关系:
```sql
SELECT DISTINCT size , ORD(size)-ORD((SELECT SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT size ORDER BY FIELD(size,'S','M','L','XL','XXL')),'|',1))) AS enum_index FROM shirts;
```
这段查询语句返回每种尺码对应的序号,其中减法运算用于调整起始点为零而不是 ASCII 编码值[^2]。
#### 修改现有 ENUM 列
一旦定义好之后再想改变某个 `ENUM` 列的内容并非易事,通常涉及先删除原有列并重新添加新的定义。不过自 MySQL 8.0 版本以后支持更简便的方法——即利用 `ALTER TABLE ... MODIFY COLUMN...` 来更新现有的枚举集而不必重建整个表结构。
```sql
ALTER TABLE shirts MODIFY size ENUM('XS','S','M','L','XL','XXL');
```
这条指令增加了额外的小号 (`'XS'`) 尺寸选项至原有的基础上。
阅读全文