数据库中枚举类型详解 (数据库中枚举类型) – 后浪云 |
您所在的位置:网站首页 › 数据库中的枚举类型 › 数据库中枚举类型详解 (数据库中枚举类型) – 后浪云 |
枚举类型是计算机编程中经常用到的一种数据类型,它将一组固定的值定义为枚举元素,可以在程序中进行定义、赋值和传递。在数据库中,我们也可以将枚举类型作为字段类型,来约束某个字段的数据范围,提高数据的可靠性和一致性。本文将详细介绍数据库中的枚举类型,包括定义、使用、优缺点以及实例应用。 一、枚举类型定义 在数据库中,我们可以使用 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 定义枚举类型,并将其作为表的字段类型来约束数据取值。通过实际应用的例子,我们可以更加深入地理解枚举类型的优缺点和使用方法,为数据库设计带来更多的便利和可靠性。 相关问题拓展阅读: 在数据库中存枚举值,用数字还是字符好? mysql怎么获取数据表字段enum类型的默认值 在数据库中存枚举值,用数字还是字符好?.做个字典表 试试。这样就不怕 忘了。 这个要看你的 枚举 , 是 仅仅一次只能选择一个的? 还是一次可以选择多个的. 例如你的 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 的可以是任意字符(除了=和换行符) 关于数据库中枚举类型的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 香港服务器首选后浪云,2H2G首月10元开通。后浪云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |