第三章 表的约束

我们在设计数据库表的时候,一定要在表中进行限制,不满足条件的数据就不能插入到表中。这就是“约束”。

一、空属性

1、NULL

在MySQL中的空表示为: N U L L NULL NULL。在我们学习C/C++的时候,空属性NULL表示的是数字0。但是在MySQL中,NULL不表示任何值,NULL就是什么都没有,也不表示0,也不表示空格。在MySQL中,尽可能地保证数据不为空,因为数据为空是无法参与运算(在后面会讲)。

2、空的约束

某些数据在逻辑上是不可能为空的。比如说在学校中,我们想要统计学生的信息,那么学生必定会有对应的班级,也就是说班级这一栏的数据是不可能为空的。因此,我们可以对该数据属性设定一定的约束,即:班级不能为空。约束的存在让MySQL中的数据合法性大大提高。

那么我们如何设置空的约束呢?

在创建表的时候,我们只需要在对应的变量后面加上not null即可。
语法如下:

变量名 数据类型 not null;

在这里插入图片描述
比如说我们创建一个T表,这个表中有两个变量,一个是 i d id id,一个是 n a m e name name。同时我们给id添加 n o t   n u l l not\ null not null的约束。

表创建完成后,我们看一下T表的描述。
如下图所示,我们发现,id对应的NULL空属性栏为NO,即该变量不能为空。
在这里插入图片描述

那么我们现在往表中插入数据:

在这里插入图片描述
我们发现,我们插入数据的时候,如果id一栏不写的话,MySQL就会报错,从而达到了一定的约束效果。

二、默认值

1、default

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值

2、语法

数据名 数据类型 default 默认值

在这里插入图片描述
我们创建一个T表,这个表中有三个变量:id,分数,姓名。其中,id不能为空,score默认为0分。

现在我们向这个表中插入数据:
在这里插入图片描述
我们发现,如果我们不插入score的话,MySQL会默认插入默认值0。

三、注释(列描述)

1、comment

在C/C++中我们用\\来表示注释,我们在创建表格的时候,某些变量就需要我们添加一些注释,从而方便程序员的阅读。那么在创建表的时候,我们可以用comment来写注释。

2、语法

数据名称 数据类型 comment '注释内容'

在这里插入图片描述
当我们创建完表之后,我们可以看一下这个表的描述:
在这里插入图片描述
我们发现,在表中根本看不到在创建表的时候添加的注释内容。

那我们去哪里查看注释呢?

我们可以用下面的语句查看创建该表的语句:

show create table 表的名称;

在这里插入图片描述
此时我们虽然可以看到之前添加的注释,但是格式发生了错乱。此时可以将;改写成\G,系统就会调整一下打印格式。
如下图:
在这里插入图片描述
上图就是我们创建T表的时候写下的语句,从中可以清晰地看到我们的注释内容。

四、zerofill

1、什么是zerofill

在讲解什么是zerofill之前,这里需要提及一个现象,如下图所示:
在这里插入图片描述
上图中是对某个表的描述,我们看Type一栏,在这一栏中,int后面有一个数字11,varchar后面也有一个数字20。这个数字20很明显就是我们之前规定的字符串的最大长度。

那么int后面的数字是什么意思呢?

其实这个11也是最大长度。那么zerofill就是将没有用到的高位都填写成0,但并不影响这个数值本身的大小。

2、语法

数据名称 数据类型 zerofill

在这里插入图片描述

五、主键

1、primary key

在某些情况下,某些数据只会出现一次,比如说学生的学号,人的身份证号。每个人和每个人的学号、身份证号都是不同的。因此,主键就是用来约束只出现一次的变量的。

主键约束的变量不能重复,也不能为空。

一张表只能有一个主键。

2、语法

数据名称 数据类型 primary key

比如我们创建一个只用主键修饰的id变量的表T。并向表中插入数据。
在这里插入图片描述
现在这个表中已经存在了一个数据1,我们再向其中插入一个1,看看能否成功插入。
在这里插入图片描述
我们发现,1因为已经存在了,为了避免重复,我们无法再次插入数据1,系统发上了保存。

3、主键的修改

如果我们的变量忘记添加了主键,我们可以在表创建好后再为其添加主键,
语法如下:

alter table 表的名称 add primary key (变量名);

我们先创建一个表T,这里面只有一个没有主键修饰的变量T。
在这里插入图片描述
现在我们为其补充一个主键来修饰id变量。
在这里插入图片描述
现在我们再来看一下这个表的描述:
在这里插入图片描述

在key的一栏已经出现了主键。

除了追加主键,我们也可以删除变量的主键。

alter table 表的名称 drop primary key;

在这里插入图片描述

4、复合主键

在创建表的时候,我们可以将几个变量组合在一起构成的变量组作为一个主键。

语法如下:

primary key(变量1,变量2,...)

创建一个T表,这个表中有两个变量,一个变量是id,一个变量是name,我们将id + name 的变量组添加主键。
在这里插入图片描述
现在我们向这个表中插入数据。
如下图所示:
在这里插入图片描述
我们发现,如果其中一个变量重复,我们依旧能够插入,但是如果整个变量组都发生了重复,则插入失败。

六、自增长

1、auto_increment

自增长顾名思义:自动增长。当我们用auto_increment修饰一个变量的时候,如果没有该变量赋值,那么MySQL会找到该变量的最大值,然后将最大值+1赋值给该变量。

auto_increment与主键一样,每张表只能有一个自增长变量。任何一个变量要做自增长,前提是本身是一个索引(key一栏有值)。除此以外,自增长字段必须是整数。

2、语法

数据名称 数据类型 键的类型 auto_increment

如下图所示,我们创建一个表T,这个表T中有两个变量,一个是id,一个是name。其中id变量用主键修饰,同时我们还给id附加了自增长的属性。
在这里插入图片描述
现在我们向表中插入数据:
在这里插入图片描述
我们先插入一个id为10的数据,然后再插入一个没有id的数据。但最终mysql根据我们第一个数据的id推测出了第二个数据的id值。

七、唯一键

1、unique

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键唯一键就可以解决表中有多个字段需要唯一性约的问题。

唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

2、语法

数据名 数据类型 unique

现在我们创建一个表,其中id变量用主键修饰,name变量用唯一键修饰。
在这里插入图片描述

该表的描述如下,我们发现在key值一栏体现出了二者的键值类型。
在这里插入图片描述

八、外键

1、foreign key

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

2、语法

foreign key (变量名) references 主表(变量名)

比如我们想要创建下图中所描述的表。(右侧班级表为主表,学生表为从表)
我们先创建一个主表
我们先创建主表:myclass

在这里插入图片描述
主表的描述如下:
在这里插入图片描述
现在我们创建从表,并为从表添加外键约束。
在这里插入图片描述
现在我们先往主表中插入数据。
在这里插入图片描述

然后我们向从表中插入数据:

在这里插入图片描述
我们发现如果我们插入的class_id是主表中不存在的数据的时候,mysql会发生报错。

猜你喜欢

转载自blog.csdn.net/weixin_72060925/article/details/131806445