数据库中枚举类型详解 (数据库中枚举类型)

枚举类型是计算机编程中经常用到的一种数据类型,它将一组固定的值定义为枚举元素,可以在程序中进行定义、赋值和传递。在数据库中,我们也可以将枚举类型作为字段类型,来约束某个字段的数据范围,提高数据的可靠性和一致性。本文将详细介绍数据库中的枚举类型,包括定义、使用、优缺点以及实例应用。

一、枚举类型定义

在数据库中,我们可以使用 CREATE TYPE 语句来定义一个枚举类型,语法如下:

CREATE TYPE enum_name AS ENUM (‘value1’, ‘value2’, …);

其中,enum_name 为枚举类型的名称,value1、value2 是枚举元素的值,用单引号括起来,并以逗号分隔。在定义枚举类型时,值之间不能有重复的。

例如,创建一个状态枚举类型:

CREATE TYPE status_enum AS ENUM (‘ON’, ‘OFF’, ‘UNKNOWN’);

二、枚举类型使用

定义好枚举类型后,我们就可以将其作为某个表的字段类型,如下:

CREATE TABLE sample(

id INT PRIMARY KEY,

name TEXT,

status status_enum NOT NULL

);

在这里,我们将 status_enum 类型作为 sample 表中的一个字段 status 的数据类型,它的值只能是 ON、OFF 或 UNKNOWN 中的一个。

三、枚举类型优缺点

优点:

1. 限定数据范围。使用枚举类型可以限制字段的取值范围,保证数据的一致性和有效性。

2. 易于读写。使用枚举类型可以减少数据读写的复杂度,使代码更加简洁、易于维护。

3. 节省存储空间。枚举类型的值只占用极少的存储空间,可以有效地节省数据库空间。

缺点:

1. 无法动态修改。因为枚举类型是由 CREATE TYPE 定义的,所以一旦定义后,枚举元素无法动态添加和修改,只能通过 ALTER TYPE 来删除。

2. 可读性较差。对于复杂的枚举类型,如果某个字段的值并不在已定义枚举元素中,那么就无法很好地表示该字段的含义。

四、枚举类型实例应用

下面以一个简单的订单管理系统为例,说明枚举类型的实际应用。

我们定义一个枚举类型 order_status,表示订单的状态:

CREATE TYPE order_status AS ENUM (

‘CREATED’,

‘PAYED’,

‘DELIVERED’,

‘FINISHED’,

‘CANCELED’

);

然后,我们创建一个表 orders,包含订单的各项信息:

CREATE TABLE orders(

id SERIAL PRIMARY KEY,

order_no VARCHAR(20) UNIQUE NOT NULL,

user_id INT NOT NULL,

amount DECIMAL(10,2) NOT NULL,

status order_status NOT NULL,

create_time TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL

);

在这里,我们将 status 字段的数据类型定义为 order_status 枚举类型,来限制订单状态的范围。

接下来,我们可以使用 INSERT INTO 语句来插入订单记录,如下:

INSERT INTO orders(order_no, user_id, amount, status)

VALUES (‘20230101001’, 1, 100.00, ‘CREATED’);

这里将订单状态设置为 CREATED,符合 order_status 枚举类型的定义。

当我们需要查询某个状态的订单时,可以使用 WHERE 子句来筛选:

SELECT * FROM orders WHERE status=’CREATED’;

也可以使用 GROUP BY 子句来统计每个状态的订单数量:

SELECT status, COUNT(*) FROM orders GROUP BY status;

通过枚举类型的使用,我们可以更加方便地管理订单的状态,提高系统的可维护性和易读性。

枚举类型是一种非常有用的数据类型,可以帮助我们限制数据范围、提高数据一致性和可读性。在数据库中,我们可以使用 CREATE TYPE 定义枚举类型,并将其作为表的字段类型来约束数据取值。通过实际应用的例子,我们可以更加深入地理解枚举类型的优缺点和使用方法,为数据库设计带来更多的便利和可靠性。

相关问题拓展阅读:

在数据库中存枚举值,用数字还是字符好?

.做个字典表 试试。这样就不怕 忘了。

这个要看你的

枚举

, 是 仅仅一次只能选择一个的? 还是一次可以选择多个的.

例如你的

order_id order_status

SUCS(成功success)

PCES(处理process)

某行拆姿数据, 要么就是 SUCS(成功success) , 要么就是 PCES(处理process)

这种情况下, 用字毕昌符是比较合适的。

但是如果枚举是可以选择多个的, 例如:

id desc

1 无党派

2 知识分子

4 少数民族

8 女性

16 ……

这种情况下, 如果一个人, 多个枚举都满足的情况下, 那么这种情况下, 使用 数字 是比较适合的。

也就是

如果某个人,是 无党派汉族女性研究生, 那么枚旅数绝举值 = 1+2+8

一般在主表上存储的是枚举值,另建立一个值对应说明表,查询时关联取出说明内容

mysql怎么获取数据表字段enum类型的默认值

enum有优点。但个人觉得。。。缺点更多,客观的讲:优点主要是在建数据 库的时候就可以把一些值给规范好。缺点是。。enum不适合PHP。主要是PHP是弱类型,如:你insert into ….. set a= 1,你没法知道你是想 a= ‘1’ 还是 a= 1(a=’1’是插入值1,a=1是插入enum的之一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号。),这是PHP和mysql 在使用enum 更大的问题。所以。。安心点啦。干脆点直接tinyin

mysql怎么获取数据表字段enum类型的默认值

本节主要内容:

MySQL数据类型之枚举类型ENUM

MySQL数据库提供针对字符串存储的一种特殊数据类型:枚举类型ENUM,这种数据类型可以给予我们更多提高性能、降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特性总结,其后又分别介绍了布尔类型BOOL或称布尔类型BOOLEAN,以及后续会再单独介绍类型SET。

本文详细介绍类型enum测试过程与总结,加深对mysql数据库类型enum的理解记忆。

n 枚举类型ENUM

a).数据库表mysqlops_enum结构

执行数据库表mysqlops_enum创建的SQL语句:

复制代码代码示例:

root@localhost : test 11:22:29> CREATE TABLE Mysqlops_enum(ID INT NOT NULL AUTO_INCREMENT,

-> Job_type ENUM(‘DBA’,’SA’,’Coding Engineer’,’JavaScript’,’NA’,’QA’,”,’other’) NOT NULL,

-> Work_City ENUM(‘shanghai’,’beijing’,’hangzhou’,’shenzhen’,’guangzhou’,’other’) NOT NULL DEFAULT ‘shanghai’,

-> PRIMARY KEY(ID)

-> )ENGINE=InnoDB CHARACTER SET ‘utf8’ COLLATE ‘utf8_general_ci’;

Query OK, 0 rows affected (0.00 sec)

执行查询数据库表mysqlops_enum结构的SQL语句:

复制代码代码示例:

root@localhost : test 11:23:31> SHOW CREATE TABLE Mysqlops_enum\G

*************************** 1. row ***************************

Table: Mysqlops_enum

Create Table: CREATE TABLE `Mysqlops_enum` (

`ID` int(11) NOT NULL AUTO_INCREMENT,

`Job_type` enum(‘DBA’,’SA’,’Coding Engineer’,’JavaScript’,’NA’,’QA’,”,’other’) NOT NULL,

`Work_City` enum(‘shanghai’,’beijing’,’hangzhou’,’shenzhen’,’guangzhou’,’other’) NOT NULL DEFAULT ‘shanghai’,

PRIMARY KEY (`ID`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

小结:

为方便测试枚举类型,如何处理字段定义的默认值、是否允许为NULL和空值的情况,我们定义了2个枚举类型的字段名,经过对比创建与查询数据库中表的结构信息,没有发现MySQL数据库默认修改任何信息。

b). 写入不同类型的测试数据

写入一条符合枚举类型定义的记录值:

复制代码代码示例:

root@localhost : test 11:22:35> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(1,’QA’,’shanghai’);

Query OK, 1 row affected (0.00 sec)

测试第二个枚举类型字Work_City是否允许为空记录值:

复制代码代码示例:

root@localhost : test 11:22:42> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(2,’NA’,”);

Query OK, 1 row affected, 1 warning (0.00 sec)

root@localhost : test 11:22:48> SHOW WARNINGS;

++——+——+

| Level | Code | Message|

++——+——+

| Warning | 1265 | Data truncated for column ‘Work_City’ at row 1 |

++——+——+

1 row in set (0.00 sec)

测试第二个枚举类型字段Work_City是否允许存储NULL值:

复制代码代码示例:

root@localhost : test 11:22:53> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(3,’Other’,NULL);

ERROR 1048 (23000): Column ‘Work_City’ cannot be null

测试之一个枚举类型字段Job_type是否可以存储空白值:

复制代码代码示例:

root@localhost : test 11:22:59> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(4,”,’hangzhou’);

Query OK, 1 row affected (0.00 sec)

测试第二个枚举类型字段Job_City如何处理没有在定义中描述的值域之一个枚举类型字段Work_Type的默认值没指定情况下,会默认填写那个值:

复制代码代码示例:

root@localhost : test 11:23:06> INSERT INTO Mysqlops_enum(ID,Work_City) VALUES(5,’ningbo’);

Query OK, 1 row affected, 1 warning (0.00 sec)

root@localhost : test 11:23:13> SHOW WARNINGS;

++——+——+

| Level | Code | Message|

++——+——+

| Warning | 1265 | Data truncated for column ‘Work_City’ at row 1 |

++——+——+

1 row in set (0.00 sec)

测试第二个枚举类型字段未插入数据的情况下,是否能使用上字段定义中指定的默认值:

复制代码代码示例:

root@localhost : test 11:23:17> INSERT INTO Mysqlops_enum(ID,Job_type) VALUES(6,’DBA’);

Query OK, 1 row affected (0.00 sec)

根据用户定义的枚举值与分片节点映射文件,直接定位目标分片。

用户在rule.xml中配置枚举值文件路径和分片索引是字符串还是数字,DBLE在启动时会将枚举值文件加载到内存中,形成一个映射表

在DBLE的运行过程中,用户访问使用这个算法的表时,WHERE子句中的分片索引值会被提取出来,直接查映射表得到分片编号

与MyCat的类似分片算法对比

中间件

DBLE

MyCat

分片算法种类    enum 分区算法    分片枚举    

两种中间件的枚举分片算法使用上无差别。

开发注意点

【分片索引】1. 整型数字(可以为负数)或字符串((不含=和换行符)

【分片索引】2. 枚举值之间不能重复

Male=0Male=1

或者

123=1123=2

会导致分片策略加载出错

【分片索引】3. 不同枚举值可以映射到同一个分片上

Mr=0Mrs=1Miss=1Ms=1123=0

运维注意点

【扩容】1. 增加枚举值无需数据再平衡

【扩容】2. 增加一个枚举值的分片数量数时,需要对局部数据进行迁移

【缩容】1. 减少枚举值需要数据再平衡

【缩容】2. 减少一个枚举值的分片数量数时,需要对局部数据进行迁移

配置注意点

【配置项】1. 在 rule.xml 中,可配置项为  、 和  

【配置项】2. 在 rule.xml 中配置  标签,非必须配置项,不配置该项的话,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会报错;若需要配置,必须为非负整数,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会路由至这个值的 MySQL 分片

【配置项】3. 在 rule.xml 中配置  标签,范围映射文件的路径:若在映射文件在 DBLE_HOME/conf 或其中,则可以使用相对路径的形式配置,例如,映射文件是 DBLE_HOME/conf/map/table_map.txt 时,配置值就可以简写为 map/table_map.txt;映射文件在 DBLE_HOME/conf 目录以外时,需要使用绝对路径,但这种做法需要考虑用户权限等问题,因此不建议把映射文件放在 DBLE_HOME/conf 外。

【配置项】4. 编辑 mapFile 所配置的文件

记录格式为:=

枚举值可以是整型数字,或任意字符(除了=和换行符),分片编号必须是非负整型数字,记录之间以换行分隔,一行仅能有一条记录,枚举值不能够是“DEFAULT_NODE”这个字符串,允许以“//”和“#”在行首来注释该行

【配置项】5. 在 rule.xml 中配置  标签;type 必须为整型;取值为 0 时,mapFile 的必须为整型;取值为非 0 时,mapFile 的可以是任意字符(除了=和换行符)

关于数据库中枚举类型的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 数据库中枚举类型详解 (数据库中枚举类型)