MySQL第四弹----数据库约束和数据库设计
笔上得来终觉浅,绝知此事要躬行
🔥 个人主页:星云爱编程
🔥 所属专栏:MySQL
🌷追光的人,终会万丈光芒
🎉欢迎大家点赞👍评论📝收藏⭐文章
一、数据库约束
1.1基本介绍
数据库约束是指对数据库表中的数据所施加的规则或条件,⽤于确保数据的准确性和可靠性。这 些约束可以是基于数据类型、值范围、唯⼀性、⾮空等规则,以确保数据的正确性和相容性。
1.2约束类型
类型 | 说明 |
---|---|
NOT NULL⾮空约束 | 指定⾮空约束的列不能存储NULL值 |
DEFALUT默认约束 | 当没有给列赋值时使⽤的默认值 |
UNIQUE唯⼀约束 | 指定唯⼀约束的列每⾏数据必须有唯⼀的值 |
PRIMARY KEY主键约束 | NOT NULL和UNIQUE的结合,可以指定⼀个列或多个列,有助于防⽌数据 重复和提⾼数据的查询性能 |
FOREIGN KEY外键约束 | 外键约束是⼀种关系约束,⽤于定义两个表之间的关联关系,可以确保数据 的完整性和⼀致性 |
CHECK约束 | ⽤于限制列或数据在数据库表中的值,确保数据的准确性和可靠性 |
1.3 NOT NULL (非空约束)
1.3.1基本介绍
定义表时某列不允许为NULL时,可以为列添加非空约束。
1.3.2语法:
字段名 字段类型 NOT NULL;
1.3.3使用细节
(1)如果在列上定义了NOT NULL,那么当插入数据时,必须为列提供数据。
(2)查看表结构,NULL列为NO表⽰值不允许为NULL,YES表⽰值可以为NULL
1.4 DEFALUT (默认值约束)
1.4.1基本介绍
DEFAULT 约束⽤于向列中插⼊默认值,如果没有为列设置值,那么会将默认值设置到该列。
1.4.2语法:
字段名 字段类型 DEFAULT 默认值;
1.4.3使用细节
(1)插⼊⼀条记录,当不指定被default约束的列时,该列会使⽤默认值;
(2)当⼿动明确指年龄列为NULL时列值为NULL。
1.5UNIQUE(唯⼀约束)
1.5.1基本介绍
指 定了唯⼀约束的列,该列的值在所有记录中不能重复,⽐如⼀个⼈的⾝份证号,学⽣的学号等。
1.5.2语法:
字段名 字段类型 UNIQUE;
1.5.3使用细节
(1)不设置唯⼀约束时,该列的值可以重复,加了唯一约束后,该列的值不能重复,但是可以为NULL;
(2)如果没有指定NOT NULL,则unique字段可以有多个NULL;
(3)一张表可以有多个unique字段;
(4)如果一个字段(列)被unique not null约束,其效果类似primary key(主键约束)。
1.6 PRIMARY KEY(主键约束)
1.6.1基本介绍
主键约束用于唯⼀标识数据库表中的每条记录。
1.6.2语法:
字段名 字段类型 PRIMARY KEY;
1.6.3使用细节
(1)主键必须包含唯⼀的值,且不能包含NULL值。
故:如果一个字段(列)被unique not null约束,其效果类似primary key(主键约束)。
(2)每个表只能有⼀个主键,可以由单个列或多个列组成。
(3)主键的指定方式有两种:
①直接在字段名后指定:字段名 PRIMARY KEY;
②在表定义最后写:PRIMARY KEY(列名)。
(4)通常为每张表都指定⼀个主键,主键列建议使用BIGINT类型。
(5)使用desc 表名,查看表结构,可以看到PRIMARY KEY的情况:Key列显示是PRI表⽰主键:
添加⾮空和唯⼀约束之后Key列也会显⽰PRI。
1.7自增长
1.7.1基本介绍
当我们在添加记录的时候,被自增长修饰过的字段(列)会自动增长。
1.7.2语法:
字段名 整型 PRIMARY KEY auto_increment;
1.7.3使用细节
(1)一般来说,自增长是和primary key配合使用的;
(2)子增长也可以单独使用,但是需要配合一个unique约束;
(3)子增长修饰的字段是为整数型的(虽然小数也可以,但这种使用极少);
(4)自增长默认从1开始,也可以通过如下命令更改初始值:
alter table 表名 auto_increment=新的初始值;
(5)如果在添加数据时,给自增长字段指定有值,则以指定的值为准,通常情况下,就按照自增长的规则来添加数据。
(6)用desc 表名查看表结构时,Extra列显⽰auto_increment表示自增:
1.8FOREIGN KEY外键约束
1.8.1基本介绍
外键⽤于定义主表和从表之间的关系;
外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束;
当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为null。
1.8.2语法
FOREIGN KEY(本表字段名) REFERENCES
主表名(主键名或unqiue字段名)
1.8.3使用细节
(1)外键指向的表的字段,要求是primary key或unique;
(2)表的类型是innodb,这样的表才支持外键;
(3)外键字段的类型要和主键字段的类型一致(长度可以不同);
(4)外键字段的值,必须在主键字段出现过,或者为NULL(前提是外键字段允许为NULL);
(5)一旦建立主外键的关系,删除主表某条记录时,从表中不能有对该记录的引⽤;
(6)删除主表时要先删除从表;
(7)用desc 表名查看表结构,Key列的值为MUL表示外键约束的列:
1.9CHECK约束
1.9.1基本介绍
可以应⽤于⼀个或多个列,⽤于限制列中可接受的数据值,从⽽确保数据的完整性和准确性。
在8.0.16开始全⾯⽀持CHECK约束,之前的版本会忽略CHECK的定义
1.9.2语法:
字段名(列名) 类型 CHECK (check条件)
1.9.3使用细节
列与列之间也可以⽐较,需要在单独一行中定义。
create table t_check (
c1 int check(c1 <> 0),
c2 int check(c2 > 0),
c3 int,
check(c3 >= c2)
);
二、数据库设计
2.1范式
数据库的范式是⼀组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数 据库,这些不同的规范要求被称为不同的范式。
关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德 范式(BCNF)、第四范式(4NF)和第五范式(5NF,⼜称完美范式),越高的范式数据库冗余越 小。然而,普遍认为范式越⾼虽然对数据关系有更好的约束性,但也可能导致数据库IO更繁忙,因此 在实际应用中,数据库设计通常只需满足第三范式即可。
2.2第一范式
2.2.1基本介绍
(1)数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,对象等非原⼦数据。
(2)在关系型数据库的设计中,满足第一范式是对关系模式的基本要求。不满足第⼀范式的数据库就不能被称为关系数据库。
2.2.2例子
(1)反例
(2) 正例
2.3第⼆范式
2.3.1基本介绍
在满足第⼀范式的基础上,不存在非关键字段对任意候选键的部分函数依赖。存在于表中定义了复合 主键的情况下。
候选键:可以唯一标识一行数据的列或列的组合,可以从候选键中选一个或多个当做表的主键
2.3.2不满足第⼆范式时可能出现的问题
(1)数据冗余
学⽣的姓名、年龄、性别和课程的学分在每行记录中重复出现,造成了大量的数据冗余。
(2)更新异常
如果要调整MySQL的学分,那么就需要更新表中所有关于MySQL的记录,⼀旦执行中断导致某些 记录更新成功,某些数据更新失败,就会造成表中同⼀⻔课程出现不同学分的情况,出现数据不一致问题。
(3)插⼊异常
⽬前这样的设计,成绩与每一门课和学生都有对应关系,也就是说只有学生参加选修课程考试取 得了成绩才能生成一条记录。当有一门新课还没有学生参加考试取得成绩之前,那么这门新课在数据库中是不存在的,因为成绩为空时记录没有意义。
(4)删除异常
把毕业学生的考试数据全都删除,此时课程和学分的信息也会被删除掉,有可能导致⼀段时间 内,数据库里没有某门课程和学分的信息。
2.4 第三范式
2.4.1基本介绍
在满足第⼆范式的基础上,不存在非关键字段,对任一候选键的传递依赖。
2.5设计过程
1. 从现实业务中抽象得到概念类 概念类是从现实世界中抽象出来的,在需求分析阶段就需要确定下来
◦ 类对应了数据库设计中的实体,实体对应了数据库中的表
◦ 类中的属性对应实体中的属性,实体的属性对应了表中的列
2. 确定实体与实体之间的关系,并画出E-R画,方便项⽬参与⼈员理解与沟通
3. 根据E-R图完成SQL语句的编号并创建数据库
2.6实体-关系图
2.6.1基本介绍
实体-关系图(Entity-RelationshipDiagram)简称E-R图,也称作实体联系模型、实体关系模型,是 ⼀种⽤于描述数据模型的概念图,主要⽤于数据库设计阶段。
2.6.2E-R图的基本组成
E-R图包含了以下三种基本成分:
• 实体:即数据对象,用矩形框表示,比如、学生、班级等。
• 属性:实体的特性,用椭圆形或圆⻆矩形表示,如学生的姓名、年龄等。
• 关系:实体之间的联系,用菱形框表示,并标明关系的类型,并用直线将相关实体与关系连接起 来。
2.7关系的类型
2.7.1⼀对⼀关系(1:1)
⼀个用户实体包含的属性有:用户昵称,真实姓名,⼿机号,邮箱地址,性别,学校
⼀个账户实体包含的属性有:登录用户名,密码
用户实体与账户实体是⼀对⼀的关系,用E-R图表示如下:
2.7.2⼀对多关系(1:N)
⼀个学生实体包含的属性有:真实姓名,学号,年龄,性别,入学时间
• ⼀个班级实体包含的属性有:班级名,学生人数
• ⼀个班级中有多个学生,所以班级实体与学生实体是⼀对多的关系,反过来说学生实体与班级实体 是多对⼀着么,用E-R图表示如下:
2.7.3多对多关系(M:N)
⼀个学生实体包含的属性有:真实姓名,学号,年龄,性别,⼊学时间
⼀个课程实体包含的属性有:课程名
⼀个学生可以选修改多门课程,一门课程也可以被多名学生选修改,所以学生与课程之间是多对多 关系,用E-R图表示如下:
结语
感谢您的耐心阅读,希望这篇博客能够为您带来新的视角和启发。如果您觉得内容有价值,不妨动动手指,给个赞👍,让更多的朋友看到。同时,点击关注🔔,不错过我们的每一次精彩分享。若想随时回顾这些知识点,别忘了收藏⭐,让知识触手可及。您的支持是我们前进的动力,期待与您在下一次分享中相遇!
路漫漫其修远兮,吾将上下而求索。