第三章 表的约束
我们在设计数据库表的时候,一定要在表中进行限制,不满足条件的数据就不能插入到表中。这就是“约束”。
一、空属性
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会发生报错。