初始MYSQL数据库(3)——数据库约束、数据表的设计原则

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏: MYSQL

前面我们学习了对数据表的基本操作:增、删、改、查。但在进行上述操作可能会出现一个情况:在查询的时候,可能会遇到两个编号相同或者可能为NULL的情况,这是因为我们对数据的处理不是很规范。用MYSQL中的术语来说就是我们没有对列进行约束。因此,下面我们就来学习数据库的约束。

目录

数据库约束 

NULL约束

UNIQUE:唯一约束

DEFAULT:默认值约束

PRIMARY KEY :主键约束

FOREIGN KEY:外键约束 

CHECK约束

表的设计 

第一范式 

第二范式 

第三范式 


数据库约束 

NULL约束

NOT NULL -- 指示某列不能存储NULL值。

我们前面学习了查看表的结构,那里面就有关于列是否可以存储NULL值。

那怎么把该列设置为不能填入NULL值呢?一种方式是直接创建一个新表,在新表中对列进行约束;另一种方式是修改表的结构。第二种方式,我们后面再学。

代码实现:

-- 先删除已经存在的表
drop table if exists student;

-- 再去创建一个新表
create table student (
    id bigint not null,
    name varchar(50) not null,
    gender bit(1) not null
);

这里我们再去查看表的结构会发现:此时,NULL值这列全部都是NO,也就是不允许出现NULL值。如果在插入元素的过程中出现了NULL,就会报错。

UNIQUE:唯一约束

UNIQUE -- 保证某列的每行必须有唯一的值,即该列的每个值都只能出现一次。

什么情况下使用呢?比如,学号、身份证、学校名等。

drop table if exists student;

create table student (
    id bigint unique,
    name varchar(50),
    gender bit(1)
    );

如果在插入元素的过程中,出现了重复的元素,就会报错。

DEFAULT:默认值约束

DEFAULT -- 规定当没有给列赋值时的默认值,这个默认值是可以设置的。

下面我们就来修改默认默认值:

drop table if exists student;

create table student (
    id bigint,
    name varchar(50) default '无名氏',
    gender bit(1)
    );

注意:如果此时我们插入数据的名字为NULL,那么记录中的值就是NULL,而不是无名氏。即用户指定的优先级是高于默认约束的。

PRIMARY KEY :主键约束

PRIMARY KEY 是 NOT NULL 和 UNIQUE 的结合。即确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

drop table if exists student;

create table student (
    id bigint primary key,
    name varchar(50),
    gender bit(1)
    );

注意:

1、当我们想要某列是既是非空,又是唯一时,有两种方式:一种是使用主键约束;另一种是使用NOT NULL约束+ UNIQUE约束。

并且我们通过查看其表结构,会发现两者的不同之处:

2、主键通常只能有一个,而 “not null + unique” 组合的字段可以有多个。但是我们可以通过组合列的方式来实现多个主键,也就是复合主键。

3、一般在创建一个表时,都会定义一个主键,并且这个主键大多都是和编号相关的,而且额外设置成自增的形式。 

现在我们来写入一个额外约束:自增(auto_increment) 

代码实现:

drop table if exists stu;

create table stu (
    id bigint primary key auto_increment,
    name varchar(50)
    );

这个自增的作用是:让数据库帮我们去维护主键的增长,不用我们自己去计算该插入什么数据。原理是:先找到原本数据的最大值(如果原本没数据就会插入1),然后在其基础上+1,生成一个新的值作为新的列值。常常与主键搭配使用。 

注意:自增约束只能在数值类型下使用,面对字符型是无法进行使用的。 并且如果某一次插入失败,下一次插入的时候,其自增的字段数值会在上一次自增的情况下再+1。例如:此次插入时,id 自增为了8,但是由于插入失败,因此没有该条记录,但是id在下次来自增时会变成9。因此表现出来的就是7-->9。

FOREIGN KEY:外键约束 

本表中的外键用于关联其他表的主键或唯一键。保证一个表的数据完整性(易于读懂)。

foreign key (本表的字段名) references 主表(列)

最常见的例子就是:学生表和班级表。

学生表中有班级编号,而班级表中有班级名称和班级编号,这时就可以使用外键将学生表和班级表串联起来。

现在我们来看如果不使用外键会出现什么样的问题?

我们再来看使用外键的情况是什么样子?

create table student (
	id bigint primary key,
	name varchar(50) not null,
	class_id bigint not null,
	foreign key (class_id) references class(id)
);

这时候,我们再去插入一条无效数据就会报错。

 结论:通过外键可以确保数据的完整性和关系的正确性。

注意:当两个表中字段有了外键约束之后,便不能随意删除某一个表了。

例如:我们如果要删除student表的话,是没问题的,但是如果要删除class表的话,同样会报错(外键约束)。因为此时student表中保留了class表中的相关信息,因此要删除class表,得先删除

 student表,再去删除class表。

CHECK约束

CHECK -- 保证列中的值符合指定的条件。对于MYSQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。意思是:MYSQL 数据库在解析 SQL 语句中的 CHECK 子句时会进行语法分析以确保语句的正确性,但在实际的数据操作中会忽略 CHECK 子句的约束条件,不会根据 CHECK 子句中的条件来检查或限制数据的插入、更新等操作。上面是针对5.0版本的情况下。如果我们的版本是8.0的话,CHECK子句会生效,也就不会忽略了。

下面是8.0的版本结果:

表的设计 

我们在设计表时,会遵守一些规则,这些规则被称为三大范式。当然这只是最主要的规则。

范式的概念:是用来描述数据关系的模型。既然是描述数据关系,那么肯定就不止一种。根据数据关系的特点主要分为三种:第一范式、第二范式、第三范式。

第一范式 

第一范式描述的是一对一的数据关系。根据这个概念我们就可以得知:不满足第一范式数据库,肯定不是关系型数据库。因为关系型数据库肯定是数据之间有关系的。

那么怎么判断是否满足第一范式呢?看表里的字段是否可以再分。如果可以细分的话,就不满足第一范式;反之,则满足。

例如:

在定义表时,如果表中的字段都可以用SQL中的数据类型进行描述,那其就天然满足第一范式。 

第二范式 

在满足第一范式的基础上,表中的每一个非关键字段都完全函数依赖于该表的主键。也就是说不存在非关键字段部分依赖于该表的主键。

注意:当表中不存在符合主键的情况下,其就天然满足第二范式。 

不满足第二范式可能会造成 数据冗余、更新异常、插入异常、删除异常等情况。

第三范式 

在满足第一范式和第二范式的基础上,不存在非关键字段对关键字段的传递依赖。

例如,有一个学生表(主要描述的是学生,通过学号)包含学生编号、学生姓名、班级编号、班级名称等字段。这里班级名称依赖于班级编号,而班级编号又依赖于学生编号,这就形成了传递依赖(里面也形成了两种强相关的关系)。因此可以创建两张表,一个用来描述班级,一个用来描述学生。这样每张表中就只有一种强相关的关系。消除了传递依赖。

总结:第一范式是看表中字段是否可再分;第二范式是看表中非关键字段对关键字段是否有部分依赖;第三范式是看非关键字段对关键字段是否有传递依赖。

好啦!本期 初始MYSQL数据库(3)——数据库约束、数据表的设计原则 的学习之旅就到此结束啦!我们下一期再一起学习吧!

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要学编程(ಥ_ಥ)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值