📌前言:本篇博客介绍MySQL数据库增删改查的进阶版,学习MySQL之前要先安装好MySQL,如果还没有安装的小伙伴可以看看博主前面的博客,里面有详细的安装教程。
那我们废话不多说,直接进入主体!🚀🚀🚀
一、数据库约束
1.约束类型
对于数据库来说,我们在增删改查的时候,或者是在我们生活中填表的时候,我们也会出现下面的情况,一些空有默认值在上面,如健康上报中的是否高风险默认否,一些空这个表上只能有一个,如球队选择自己球衣号码等。那么数据库中也是一样的,有约束才可以更好的展现出内容。
数据库中有下面几个主要的约束类型:
📌NOT NULL - 指示某列不能存储 NULL 值。
📌UNIQUE - 保证某列的每行必须有唯一的值。
📌DEFAULT - 规定没有给列赋值时的默认值。
📌PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
📌FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
📌CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。
? 数据库的约束:约束就是数据库在使用的时候,对于里面能够存的数据提出要求和限制,程序猿就是可以借助约束来完成更好的体验。
注意:上述的这些约束只是针对本列去进行约束,并不会影响到其他列。
接下来我们逐一介绍这些约束以及其用法。
2.NULL约束
首先来了解一下NULL约束,这个约束是指示某列不能存储 NULL 值,也就是说我们这定义这一列中,是没有NULL值的,添加不了,修改不出来的。我们来试一下,(下面用books表来演示):
首先在创建表的时候,我们就要在我们不想让它可以是NULL的那一列在定义数据类型的时候要加上not null :
create table books(id int not null,name varchar(50),price decimal(3,1),other varchar(20));
insert into books values(1001,'老人遇害',29.5,'小说');
insert into books values(1002,'如何成为世界首富',88.8,'爽文');
insert into books values(1003,'校花和她的贴身保镖',56.8,'爽文');
然后我们可以先看看这个表中每一列的信息:desc books; 我们可以看见,这里的id列的信息中,NULL这个地方是NO,而其他在定义的时候没有进行NULL约束的都是YES。然后我们尝试增加id为NULL的数据:
insert into books values(NULL,'贴身保镖不想干了',56.9,'爽文');
然后我们会发现他会报一个错误:ERROR 1048 (23000): Column 'id' cannot be null ,这个的意思就是错误1048 (23000):列“id”不能为空!,所以我们这里是很明显看得出NULL约束的作用的,我们把NULL该回任意id,它就执行成功了:
同时,NULL约束可以给定多个列,并且各个列之间互不影响,比如说上面这个表的id 和name 都设定不能为NULL,就在定义的时候都加上not null 。
3.UNIQUE唯一约束
然后就是我们的UNIQUE唯一约束,它是保证某列的每行必须有唯一的值,这就是我们举例子中的,我们在填自己的相关信息的时候,总有一些东西是唯一的,为了不出问题,如身份证号,学生号,班级代号之类的列,都可以加上这个唯一约束。
我们继续用books表来做例子:
create table books(id int unique,name varchar(50),price decimal(3,1),other varchar(20));
insert into books values(1002,'如何成为世界首富',88.8,'爽文');
insert into books values(1004,'贴身保镖不想干了',56.9,'爽文');
insert into books values(1001,'老人遇害',29.5,'小说');
insert into books values(1003,'校花和她的贴身保镖',56.8,'爽文');
同样的我们先来查一下数据:desc books;
我们看到id列在KEY处显示的是UNI,也就是定义的是唯一的了,然后我们查看一下现在表中的数据:
然后我们增加一个相同id的数据,看看能不能成功:
insert into books values(1003,'校花和她的贴身保镖',56.8,'爽文');
结果中会报:ERROR 1062 (23000): Duplicate entry '1003' for key 'id' ,也就是错误:关键字“id”的重复条目“1003”,有重复,所以添加错误,这就是UNIQUE唯一约束。
4.DEFAULT默认值约束
对于DEFAULT默认值约束,是规定没有给列赋值时的默认值,也就是当我们在添加的时候没有给它赋值,默认就会选择表中的默认值。这里我们用一个student表了演示:
create table student(id int,name varchar(20) default '匿名');
insert into student values(204023,'张三'),(204024,'李四');
得到一个表的中各列的情况是这样的:
这里的Default就是默认值,在这里我们可以看见,我们设置的name的默认值为匿名,是设置成功的,然后id列中是NULL,说明当我们不去设置默认值的时候,系统对这个列的默认值默认为NULL。
目前表的数据:
然后我们尝试增加数据,并且不输入姓名:
insert into student values(204023,'');
然后再次查一下我们的student表,发现已经有数据在里面了,并且在name中的值是?怎么是空的,什么都没有?难道是翻车了?别急,这里其实并不是我们没插入数据,只是没写数据,但还是输入了name的,我们输入中的name是空的,所以录入到表显示的时候也是空的:
如果我们想看一下默认值是怎么样的,我们只需要输入id就可以,并不需要录入name,其实在插入数据的时候,我们经常是insert into 表名 values(值,值); ,但我们也可以在表名后面加上列名,这样就是指定插入哪一个列(如下面只插入id列),然后其他的就会是插入默认值:
insert into student(id) values(204026);
查询结果:
然后这样的默认匿名数据就插入成功拉。
5.PRIMARY KEY主键约束
然后就轮到我们的主键了,这个东西还是有一点难度的,我们先要了解一下它的定义:NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
主键约束,其实就是相当于数据的唯一身份标识,类似于身份证号码或者手机号,这也是我们在日常开发中最常使用的约束,最重要的约束,创建表的时候,很多时候都需要指定主键。
在写例子之前,我们要先明确一点:
? 对于一个表来说, 只能有一个列被指定为主键!
然后我们删除上面的例子表,重新创建一个student表:
create table student(id int primary key,name varchar(20));
然后按照惯例我们先查一下表结构:desc student;
可以发现,这里的id中key的一列已经变成PRI了,也就是主键的意思,首先我们先增加两条数据,然后再试一下为空和重复这两个点,因为我们上面说到,主键是NOT NULL 和 UNIQUE的结合体:
1.id为空
insert into student values(NULL,'王五');
结果:报错:Column 'id' cannot be null ,id列不能为空值。
2.重复id
insert into student values(1002,'王五');
结果:报错:Duplicate entry '1002' for key 'PRIMARY' ,也就是关键字“PRIMARY”的重复条目“1002”,重复了,跟上面的 UNIQUE基本上是一样的。
这就没了吗,当然不是,主键还是挺有料的!
? 关于主键,典型的用法就是可以直接使用1,2,3,4 这样的整数递增的方式进行表示,在MySQL 里面组长递增的主键,是有内置支持的,成为"自增主键"。
这种自增主键,在定义的时候需要在主键上再加个东西:auto_increment
创建新表:
create table student(id int primary key auto_increment,name varchar(20));
当设定好自增主键之后,此时插入的数据,就可以不用指定自增主键的值了(可以直接用null表示)然后交给MySQL自行分配就行了。比如:
当然我们设定主键之后也是可以自己去输入想要的id的,也就是说,自增主键也可以手动设置id:
但是如果我们设置的id不是跟着上一个的,比如我们在这里设置一个id为10,然后下一个又让MySQL自行分配,这样子MySQL分配的id就是11,然后再默认就是12,然后13。这样我们的4-9的id就用不了了,但是我们手动还是可以输的:
🎈MySQL分配: 🎈手动输入:
这就是主键约束。
6.FOREIGN KEY外键约束
而对于外键约束,那就不是一个表的事情了。外键约束,是针对两张表进行关联,是保证一个表中的数据匹配另一个表中的值的参照完整性。
这里就要先用图表来进行说明先了:
这就是外键约束,也就是说外键约束,其实是描述两张表的“依赖关系”,子表依赖于父表(或者说是子表引用于父表),要求子表中对应的记录得在父表中存在。子表和父表并不一定是一对一的,只要存在就可以。
接下来我们来看看怎么定义外键约束:
1.定义外键
① .首先创建一下我们的班级表,备用:
mysql>create table class (calssid int primary key auto_increment,name varchar(50));
mysql>insert into class values(null,'网络工程1');
mysql>insert into class values(null,'网络工程2');
mysql>insert into class values(null,'网络工程3');
② .创建我们的学生表,并且以班级表作为外键
mysql> create table student (student int primary key auto_increment,
-> name varchar(20),
-> classid int,
-> foreign key (classid) references class(calssid));
其中上面的命令大家应该的比较熟悉,主要是:
foreign key (classid) references class(calssid));
首先,foreign key 表示外键,后面跟的(classid) 指向的就是student表创建的classid;然后references 表示引用,表示依赖关系即当前表的classid列引用自/依赖于class表的classid这一列;后面的class(classid) 中,class表示引用父表的名字,classid表示引用父表的列是classid这一列。
以上我们就创建好了,我们可以查看一下表结构,看见classid中的key:
2.父表约束子表
当我们在student插入数据的时候,也是经历了一些东西的:
同时,student表中的这些classid是可以重复的,只要class表中的classid有就行了:
3.子表约束父表
上面我们说到,是两个表的依赖关系,所以子表同时也是约束着父表的。
? 当父表的某个数据被子表依赖着的时候,此时进行删除和修改,都是不行的,而没有依赖的可以删。
我们用这个数据来演示,此时是有1和2被依赖,3没有被依赖的:
🎈删存在被依赖的数据:
🎈删不存在被依赖的数据
4.总结
外键约束的工作原理:在子表中插入新的数据的时候,就会先根据对应的值,在父表中先查询,查询到之后,才能够执行后续的插入。
对于这里的先从父表查询操作,可能是一个成本比较高的操作(比较耗时),外键也是其实要求,父表中被依赖的这一列,必须要有索引,有了索引可以大大提高查询速度。也就是说像上面的class表中classid列,得是primarykey或者unique(有这两个约束,会自动创建索引)。
7.CHECK约束
?CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
这个CHECK约束并不常用,只需要了解知道即可。
🚩以上便上MySQL表的MySQL表的约束,接下来的一篇文章应该就是MySQL的增删改查(进阶版)了。欢迎关注。一起学习,共同努力!
还有一件事:
|