找往期文章包括但不限于本期文章中不懂的知识点:
个人主页:我要学编程(ಥ_ಥ)-CSDN博客
所属专栏: MYSQL
前面我们学习了对数据表的基本操作:增、删、改、查。但在进行上述操作可能会出现一个情况:在查询的时候,可能会遇到两个编号相同或者可能为NULL的情况,这是因为我们对数据的处理不是很规范。用MYSQL中的术语来说就是我们没有对列进行约束。因此,下面我们就来学习数据库的约束。
目录
数据库约束
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)——数据库约束、数据表的设计原则 的学习之旅就到此结束啦!我们下一期再一起学习吧!