MySQL表约束
目录
空属性
默认值
列描述
zerofill
主键
单字段主键
复合主键
唯一键
自增长
外键
MySQL数据库的主要功能就是用于对数据的存储和查询,所以MySQL对于数据的约束是很强的,而MySQL数据库的本质就是多个表的集合,所以MySQL数据库对于数据的约束就体现在了MySQL数据库对表的约束上,所以本期我们要学习的主要内容就是MySQL表约束。
空属性
空属性无非就两个值 null 和 not null。
比如我们创建了一个学生表,我们要使得一个字段为null,那么直接就默认不往这个字段插入数据即可,此时就是默认的 null,但是有些场景下,有些字段是不能为空的,比如后面学习的主键约束,主键是不能为空的,所以就必须在创建表示在类型后面添加 not null语句。虽然字段不插入数据时默认为空,但是我们不建议使用默认的 null值,因为null值是没有意义的。
创建一个学生表,字段为 ID,该字段不能为空。
当我们插入空值时,会提示报错,因为该字段不能为空。
更改student 的ID字段使之可以为空。
给对应ID字段插入空值。
我们发现插入成功,因为没有约束不能为空,就默认可以为空。
给student表添加name字段。
给对应字段插入数据,如果我们没有显示的给某一字段插入数据,此时mysql就会自动给该字段填入null值,但一般情况下,我们不建议让mysql自动填充,而且也不建议给字段插入null值,所以也就意味着插入数据时必须给对应的字段插入有效数据,图示如下。
默认值
这个默认值类似于C++中的缺省值的概念,就是如果某个字段允许为空,而我们没有插入值,本来会被mysql填充成null,但是现在有了缺省值,此时这个字段就会被填充成默认值。
给student表添加phone字段,缺省值为'123456' 。
插入一条记录,但是我们省略了phone字段,最终,phone字段采用的是默认值。
列描述
列描述类似于C++和C语言中的注释语句,C和C++中注释语句可以告知程序员这些代码具体用于实现了什么功能,注意什么,在mysql中列描述就可以告知程序员,这些列代表了什么,有什么样的具体含义。
在mysql中通过comment来进行列描述。
创建一个class表,字段为classid,描述为班级号,图示如下。
通过desc是看不到comment信息的,但是可以通过show create table 查看comment信息。
zerofill
在之前我们创建表时,喜欢给int后面带上一个括号,然后再给括号里面填充一个整数,很多小伙伴会比较困惑,这个括号里面填充上整数,是代表着这是一个整形数组吗,括号里面的整数代表了数组有几个元素,是这样吗?
实际上并不是这样,varchar(size)和char(size)中的size表示了字符串中字符的个数,但是int(num)中的这个num可不代表个数,而且如果给字段没有填充zerofill这个属性,int(num)中num就是毫无意义的。
往class表中插入num字段类型为int(5),表示当前课程号被选择的学生人数,图示如下。
我们发现在我们没有对num属性使用zerofill属性修饰时,类型int(5)中的5其实是没有什么意义的。
我们给num字段添加zerofill属性。
不难发现,zerofill属性其实就是给int类型进行补0,int(num)表示整型数字的位数,不够num位就进行补0。
主键
单字段主键
在日常的生活情境中,一个大学生,在学校的学号是唯一的,所以如果要给大学生建立一个表在表中设置了一个字段为学号,这个学号的字段就是不能重复的,怎么样保证这个字段不能重复呢?有两个方法,一个方法就是设置成主键一个方法就是设置成唯一键。
所以主键的概念由此产生。在创建字段时,在字段类型后跟primary属性就可以使得该字段成为主键。
设置ID为主键,那么此时就不允许主键字段的值为空,图示如下。
需要注意的是,主键最重要的特点就是唯一的,一张表只能有一个主键(这里为后续的唯一键埋下了伏笔)。
删除主键:alter table table_name drop primary key;
删除student表中ID主键。
需要注意的是,删除主键只是删除了主键字段的主键属性,对应的字段仍然是存在的,只不过此时这个字段已经不具备主键属性罢了。
我们还可以通过其他方式创建主键。
设置主键:alter table table_name add primary key (主键字段)。
重新设置字段ID为主键。
复合主键
除此之外,一张表的主键也可以是两个字段组合成的主键。创建一个user表,user表的字段有账号 userid,姓名 name ,地址 address。姓名不唯一,地址不唯一,但是姓名和地址加在一起就是唯一的,所以主键也有可能是两个字段合起来成为一个主键,我们称这个主键是复合主键。
创建user表。
往user表中插入数据,图示如下。
通过上图不难发现,当复合主键存在时,我们插入数据,只要插入的数据的复合主键的一个字段不与已经存在的数据的复合主键之中的一个字段冲突,我们就认为不存在主键冲突,是允许插入的,只有插入的数据的复合主键的两个字段都与已经存在的数据的复合主键两个字段冲突我们才认为冲突,不允许插入。
唯一键
上个标题我们讲述了主键,也为唯一键埋下了伏笔,我们说一张表中主键是唯一的,也就说表中只能有一个字段被设置成主键,那么问题来了,student表中,学号ID是唯一的,身份证号id_card也是唯一的,我们将ID设置成了主键,表明了学号是唯一的,那么id_card怎么办,如果只有主键才能保证一个字段的唯一性,那么此时我们对于id_card这个字段要设置成唯一就显得无能为力,数据库无绝人之路,所以数据库就提供了另外一个具有唯一性的字段,我们称之为唯一键。
唯一键通过unique 进行设定。
我们将student表中的id_card设置为唯一键。
当然,我们也可以在创建表时 在类型的后面带上unique进行设定。比如,创建一个people表,我们将people的phone设置为唯一键。
通过上图,我们发现了一个有意思的现象,当我们设置一个字段为unique唯一键时,如果没有添加not null属性,那么此时这个字段就被设置成了唯一键。 但是如果我们在设置唯一键时,在唯一键后添加了not null属性,那么此时这个字段就依然会被设置成主键,因为主键是唯一且不能为空的。
所以此时唯一键和主键的区别就来了,主键是不能为空的,而唯一键是可以为空的,这二者的区别就是在设置字段时添加不同属性带来的区别,在应用层看来其实并没有多大区别,因为二者都是具有唯一性的。因为是字段被设置成为了主键和唯一键,而不是字段一创建就是主键和唯一键。
往people表中插入数据。
唯一键对应的字段也是不允许插入相同的数据的,因为保证该字段的唯一性。但是我们插入了两个null值呀,虽然是相同的两个null值,但是null值并不是有效的数据,所以不能用来判断是否相等。
自增长
自增长的特点:
- 任何一个字段要做自增长,自身必须是key值,一般为主键和唯一键。
- 自增长字段必须是整数。
- 一张表最多只能有一个自增长。
创建了一个小孩表,插入数据,观察主键ID字段的变化。
不难发现,ID字段逐渐增长。
创建adult表,将ID字段设为唯一键,然后设置自增长属性。
通过上图不难发现,唯一键属性后添加自增长属性,此时唯一键就不再是唯一键,而是主键,因为此时的唯一键不但唯一,且还不能为空,因为自增长字段会自动填充值,所以不会导致唯一键为空,这也就是为什么唯一键添加了自增长属性之后变成了主键。
外键
外键其实也很好理解,简单来说就是通过外键,实现了两个表的链接。
举个例子,学生表student中有学号 ID,姓名 name和课程号id class_id。课程表class中含有课程id id和课程名称 name字段。此时student表和class表就通过课程id这一字段建立了链接,图示如下。
其实在外键中,最重要的其实就是外键约束,只有存在外键约束,那么这个外键才是有意义的。
创建两个表student和class,首先不加外键约束。
往两个表中插入数据。
通过上图不难发现,课程表中并没有课程id为1的课程,但是我们在往student表中插入数据时,竟然插入了课程号为1数据。就相当于在大学中,没有 电竞课但是小明却选择了电竞课,这明显是不符合常理的,这一切的原因就是因为我们在创建student表时没有创建外键约束。
我们给student表中的classid字段添加外键约束。
再次插入数据。
如上图,因为有了外键的约束,此时student表中不能插入数据,因为字段classid为1的数据在class表id字段中并不存在。
这其实就牵扯到了一个主表和从表的概念,我们一般称存在外键的表为从表,从表的外键所参考的表为主表,从表的外键必须参考主表的主键,其实也可以是唯一键,只要保证字段唯一的键从表的外键都可以参考,主表的主键中的数据都没有,从表外键参看主表主键(唯一键),从表外键自然不能插入数据,这也就是上述数据插入失败的主要原因,上述表中,student表为从表,class表为主表,student表数据的插入必须参考class表。
所以,先为主表class插入数据。
然后从表再次插入数据。
如上图,需要注意的是,外键的数据是可以重复的。
有了外键约束之后,其实主表和从表都产生了制约关系,为什么这样说呢?
主表对从表的约束我们上面已经讲过,主表对从表的约束体现在了从表在插入数据时,插入数据的外键数据必须已经在主表的主键数据中包含,否则不能插入,插入就会报错。
而从表对主表的约束体现在主表要删除记录时,得先看自己删除的记录的唯一键对应的外键中是否有相同的数据,如果有是不能删除的,必须让从表先删除相同的数据之后,主表才可以删。图示如下。
要注意的是,从表的外键不一定只参考主表的主键,只要是唯一的键都可以,一般为主键和唯一键。
以上便是MySQL数据库表约束的全部内容。
本期内容到此结束^_^