首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我应该使用ENUM作为主键和外键吗?

在数据库设计中,选择主键和外键时,ENUM 类型可以作为一个选项,但是是否使用 ENUM 作为主键和外键需要根据具体的业务场景和需求来决定。

ENUM 类型是一种枚举类型,它可以在表中存储一组预定义的值。ENUM 类型可以减少数据库中的重复数据,并且可以提高数据的一致性和可读性。

如果表中的某个字段只有几个固定的值,并且这些值不会频繁更改,那么可以考虑使用 ENUM 类型作为主键或外键。例如,在一个表示用户角色的表中,可以使用 ENUM 类型作为主键或外键,因为用户角色通常是固定的,例如管理员、编辑、作者等等。

但是,如果表中的某个字段的值非常多,或者需要频繁更改,那么使用 ENUM 类型可能不是最佳选择。例如,在一个表示用户信息的表中,使用 ENUM 类型作为主键或外键可能不是最佳选择,因为用户信息通常是动态变化的,并且可能需要频繁更改。

总之,选择使用 ENUM 类型作为主键和外键需要根据具体的业务场景和需求来决定。如果需要减少数据库中的重复数据,并且数据的取值范围是固定的,那么可以考虑使用 ENUM 类型。但是,如果数据的取值范围非常多,或者需要频繁更改,那么使用 ENUM 类型可能不是最佳选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

数据库进阶4 Mysql 性能优化20个原则(2)

而且,在MySQL数据引擎下,还有一些操作需要使用主键,在这些情况下,主键的性能设置变得非常重要,比如,集群,分区…… 在这里,只有一个情况是例外,那就是“关联表”的“”,也就是说,这个表的主键,...我们把这个情况叫做“”。...比如:有一个“学生表”有学生的ID,有一个“课程表”有课程ID,那么,“成绩表”就是“关联表”了,其关联了学生表课程表,在成绩表中,学生ID课程ID叫“”其共同组成主键。 9....使用 ENUM 而不是 VARCHAR ENUM 类型是非常快紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。...首先,问问你自己“Empty”“NULL”有多大的区别(如果是INT,那就是0NULL)?如果你觉得它们之间没有什么区别,那么你就不要使用NULL。(你知道

44820

MySQL数据库基础练习系列12、论坛管理系统

数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。..., (2, 4, '觉得Macbook Pro不错。'), (3, 5, '请发送简历到hr@example.com'), (4, 1, '期待参加,有什么奖品?')...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

5610
  • MySQL数据库基础练习系列37、问卷调查统计分析系统

    统计分析:对问卷数据进行统计、分析可视化展示。 数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。 例如,如果有一个“地址”列,它包含了街道、城市、省份国家等信息,那么这就违反了第一范式。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    12510

    MySQL数据库基础练习3、订单管理系统

    , -- 订单明细ID,自增主键 order_id INT NOT NULL, -- 订单ID,不能为空,引用...order_id INT NOT NULL, -- 订单ID,不能为空,引用 shipping_status ENUM('未发货...也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。 例如,如果有一个“地址”列,它包含了街道、城市、省份国家等信息,那么这就违反了第一范式。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    9610

    一文了解Mysql

    Mysql中InnoDB引擎支持的4种事务隔离级别 Mysql中如何使用ENUM? Mysql中的存储引擎 mysql中char与varchar的区别? 主键候选的区别?...而关系型数据库使用最为广泛的莫过于Oracle、Mysql以及SQL Server。这里是以Mysql作为基础进行讲解。 数据库中的几个基本术语 数据库:存储数据的仓库,是一些关联表的集合。...varchar需要在数据之前使用一到两个字节存储数据长度。最多情况下可以存储65532个字符数。 主键、超候选的区别?...主键主键刚才其实已经讲过了,一个数据表只能够设置一个主键,可以唯一标识一条数据,但是可以多个列组合当成主键使用。 超:能唯一标识数据表的都可以作为。...第二范式:每个数据表必须拥有主键,并且唯一标识整个数据表。 第三范式:消除数据冗余,信息只在一个数据表存储,不能存储在多张数据表。然后通过进行关联。 blobtext的区别?

    91620

    MySQL数据库基础练习系列45、优惠券发放系统

    /feng8403000/89403778 项目名称与项目简介 优惠券发放系统是一个用于管理优惠券的发放、领取使用的系统。...数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    12410

    MySQL数据库基础练习系列49、邮件群发系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...('SSL', 'TLS', '无') NOT NULL COMMENT '加密方式' ); 插入数据DML(注意插入数据顺序) 插入数据的时候也要注意主外关系,如果没有检的情况下是没有办法插入从表数据的...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    7310

    《深入浅出SQL》问答录(六)

    本系列出自《深入浅出MySQL》,全文以问答形式展开,是的个人学习笔记。 问答录 先看花絮 Q:如果是NULL,它右什么作用?有办法确定已经连接到父了吗?...---- Q:不能单纯的使用另一张表的,称之为,而不加上约束? A:其实可以,但创建成约束后,就只能插入已经存在于父表中的值,有助于加强两张表间的连接。...如果我们试着删除主键表中的行或者是改变主键值,而这个主键是其他表的约束时,你就会收到错误警告。 ---- Q:所以上面说的那种,就不能删除了是?... 约束 创建一张表并加上可作为的列虽然很简单,但除非你利用CREATE或ALTER语句来指定,否则都不算是真的。创建在结构内的被称为约束。...插入列的值必须已经存在与父表的来源中,这是引用完整性。 创建作为表的约束提供了明确的优势,如果违反了规则,约束会阻止我们破坏表。 不一定要是父表的主键,但是要具有唯一性。

    1.1K20

    SQL笔记(1)——MySQL创建数据库

    括号内的内容表示列名; REFERENCES teacher(id):列所参考的表列。REFERENCES 关键字指定被参考表的名称,括号内的内容则表示该表的某一列名称,作为列的参考值。...需要注意的是,为了使用约束,必须先创建被参考表 teacher 中的 id 列,并将其设置为主键。...在实际应用中,我们通常将主键作为一种基础元素,通过主键约束的方式来保证主键所包含的列数据的完整性唯一性,从而提高数据库的稳定性安全性。...主键约束可以约束非主键 在关系型数据库中,主键约束是一种为了保证表中主键列的唯一性非空性而应用于主键列上的一种约束。因此,主键约束只能应用于表中的主键列,而不能应用于其他的列。...主键约束在查询排序时也能提高性能。 约束:可以确保表中指向其他表的字段只包含该表中存在的值。约束还可以防止删除数据时出现意外情况(例如删除了被其他表所引用的数据)。

    3.1K20

    MySQL数据库基础练习系列10、访客登记系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。 第三范式(3NF, Third Normal Form) 定义: 满足2NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    9210

    MySQL数据库基础练习系列40、报销审批系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。 例如,如果有一个“地址”列,它包含了街道、城市、省份国家等信息,那么这就违反了第一范式。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    8110

    MySQL数据库基础练习系列15、电子邮件管理系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。 例如,如果有一个“地址”列,它包含了街道、城市、省份国家等信息,那么这就违反了第一范式。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    8410

    2022年Java秋招面试必看的 | MySQL调优面试题

    6、主键候选有什么区别? 表格的每一行都由主键唯一标识,一个表只有一个主键主键也是候选。按照惯例, 候选可以被指定为主键, 并且可以用于任何引用。...4、NOW() – 将当前日期时间作为一个值返回。 5、MONTH(), DAY( ), YEAR(), WEEK(), WEEKDAY() – 从日期值中提取给定数据。...图片 49、在 Mysql 中 ENUM 的用法是什么? ENUM 是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。...57、主键候选有什么区别? 表格的每一行都由主键唯一标识,一个表只有一个主键主键也是候选。按照惯例,候选可以被指定为主键,并且可以用于任何引用。...图片 96、唯一索引比普通索引快, 为什么 图片 97、MySQL由哪些部分组成, 分别用来做什么 图片 98、MySQL查询缓存有什么弊端, 应该什么情况下使用, 8.0版本对查询缓存有什么变更.

    2.8K30

    MySQL数据库基础练习系列36、科研项目管理系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。 例如,如果有一个“地址”列,它包含了街道、城市、省份国家等信息,那么这就违反了第一范式。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    13910

    MySQL数据库基础练习系列14、博客后台管理系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。 例如,如果有一个“地址”列,它包含了街道、城市、省份国家等信息,那么这就违反了第一范式。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    8710

    MySQL数据库基础练习系列48、短信发送系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。 例如,如果有一个“地址”列,它包含了街道、城市、省份国家等信息,那么这就违反了第一范式。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    7310

    MySQL数据库开发规范知识点速查

    禁止给每一列都建立单独的索引 每个Innodb表必须有一个主键使用更新频繁的列作为主键,不使用多列主键,因为更新后就涉及对索引顺序的修改,频繁更新会导致频繁调整,导致降低性能 不使用UUID,md5...,hash字符串作为主键,因为这类哈希不保证插入时递增的特性 建议:使用自增ID值 在哪建立索引?...覆盖索引:包含了所有查询字段的索引 避免Innodb表进行索引的二次查找 可以把随机IO变为顺序IO加快查询效率 尽量避免使用 是用于保证数据的参照完整性,但建议在业务端实现。...MySQL会建立索引 不建议使用约束 表与表之间的关联建立索引是必须的 会影响父表子表的写操作而降低性能(检查约束导致的) 字段设计规范 优先选择符合存储需要的最小的数据类型 将字符串转化为数字类型存储...避免使用 ENUM数据类型 修改 ENUM值会导致表结构的修改 ENUM的 ORDER BY需要额外操作,效率低 禁止使用数值作为ENUM的枚举值 尽可能把所有列定义为 NOT NULL 索引 NULL

    1.5K110

    MySQL数据库基础练习系列4、商品库存管理系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。 第三范式(3NF, Third Normal Form) 定义: 满足2NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    9810

    MySQL总结

    ==InnoDB==>>>用于事务处理应用程序,支持行级锁。...2.一张表里面,通常都应该有一个id字段,而且通常把这个id字段作为主键,当然你非要让其他的字段作为主键也是可以的,看你自己的设计,创建表的时候,一般都会写create table t1(id int...有同学说,老师,不写primary key行不,只写一个not null unique字段,当然行,但是我们应该这样做,是不是不应该啊,所以以后设置主键的时候,就使用primary key来指定...指定模式的语法:foreign key(字段)references 父表(主键字段)on delete 模式 on update 模式; 注意:删除置空的前提条件是 字段允许为空,不然会创建失败...虽然很强大,能够进行各种约束,但是的约束降低了数据的可控性可拓展性。通常在实际开发时,很少使用来约束。

    1.9K30

    MySQL数据库基础练习系列43、广告管理系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有关系导致的创建异常。...应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”“国家”。 第二范式(2NF, Second Normal Form) 定义: 满足1NF。...如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。 第三范式(3NF, Third Normal Form) 定义: 满足2NF。...它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键与原表进行关联。

    8310
    领券