mysql 枚举的使用_MySQL数据库--枚举的使用

使用枚举(ENUM)代替字符串类型

有时候可以使用枚举代替常用的字符串类型,枚举列可以把一些不重复的字符串存储成一个预定义的集合,MySQL在存储枚举时非常紧凑,会根据列表值的数量压缩到1个或2个字节中。MySQL在内部会将每个值在列表中的位置保存为整数,并且在.frm文件中保存“数字-字符串”映射关系的“查找表”。

下面用一个实例说明相关操作和事项

① 新建一个枚举列测试表

CREATE TABLE `enum_test` (

`id` int(6) NOT NULL AUTO_INCREMENT,

`e` enum('男','女') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

PRIMARY KEY (`id`) USING BTREE

)

② 插入数据

INSERT INTO `enum_test`(e) VALUES(1),(2);

INSERT INTO `enum_test`(e) VALUES('男'),('女');

INSERT INTO `enum_test`(e) VALUES(1),('1'),('女'),(0);

这三种插入方式都OK,0也可以插入,插入的是一个空字符串'', 而插入的‘数字’也是可以的

当插入的数字或字符串不在枚举范围内,则会用0或空字符串代替

③ 查询数据

SELECT * from `enum_test`

查询的结果如下:

2e267d0bc0bb2f5948a3cd0748da1201.png

查询时,通过 “列名+0” 即可获取改值在枚举中的位置关系,如下吗的SQL语句

SELECT id,e,e+0 from `enum_test`

查询结果

053026e786253a179b6506d6de770c6b.png

使用起来跟方便,比如存取数字和对应的字符串时,避免了case when 转换;

注意:enmu列字符串无法通过order by 排序

SELECT id,e,e+0 from `enum_test` ORDER BY e DESC

查询的结果是通过枚举的位置就行排序的,如下图所示

1e8e37cb4f696a4b28d6832ac064b90e.png

④ 修改枚举

ALTER TABLE `enum_test` MODIFY COLUMN `e` enum('男','女','未知');

INSERT INTO `enum_test`(e) VALUES(3);

SELECT id,e,e+0 from `enum_test` ;

在枚举字符串后面添加新的字符串,不影响之前的数据

beca12e55bfdc25a3d7340988864caf8.png

在枚举的字符串中间或前面加入新的字符串,会对之前的数据产生影响;位置不变时,改变之前的字符串的信息,之前的数据 “e+1”的值不会产生变化

ALTER TABLE `enum_test` MODIFY COLUMN `e` enum('男','未知','女');

SELECT id,e,e+0 from `enum_test` ;

ALTER TABLE `enum_test` MODIFY COLUMN `e` enum('未知','男','女');

SELECT id,e,e+0 from `enum_test` ;

在枚举的中间插入数据,结果如下图

f20b4dba0c22aab9189bab04c68085c7.png

在枚举最前面插入数据,结果如下图

a92b11b9dcb57fcb7e1540e4a921d5bf.png

位置不变,修改枚举字符串信息 或 减少枚举字符串现有的数量 ,数据会产生不可逆变化,绝对禁止这样的操作

ALTER TABLE `enum_test` MODIFY COLUMN `e` enum('男','女1');

SELECT id,e,e+0 from `enum_test`;

-- 改回去之后,数据已经发送不可逆转破坏,无法找回之前的数据了

ALTER TABLE `enum_test` MODIFY COLUMN `e` enum('男','女' );

SELECT id,e,e+0 from `enum_test`

两次查询的结果都如下图所示

ec2a9e350a36c813570dfbf363e5f753.png

⑤ 修改枚举列的数据的值

update `enum_test` set e = '男' where id=7;

update `enum_test` set e = 1 where id=8 ;

update `enum_test` set e = '1' where id=8 ;

SELECT id,e,e+0 from `enum_test` ;

查询的结果如下图所示

6cb20299347b7fdae39abf04a2b124e6.png

结果显示,枚举列数据的修改同插入的传值方式一样,挺方便的

总结

采用枚举列处理select标签或redio标签的下拉数据的数据很方便,在处理用数字替代字符串的字段数据时,比 case when 的处理方式,快捷有效!

但是它也有致命的缺陷,不能减少或修改(包括修改现有的枚举字符串信息、在中间或最前面插入新的字符串)现有的枚举列表,只能在后面新增枚举字符串信息

对于一些了未来可能会改变的字符串,使用枚举不是一个好主意

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值