【MySQL】MySQL表的约束

📌前言:本篇博客介绍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));
//创建一个books表,其中id列不能为null

//先插入一些数据
 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约束可以给定多个列,并且各个列之间互不影响,比如说上面这个表的idname都设定不能为NULL,就在定义的时候都加上not null


3.UNIQUE唯一约束

然后就是我们的UNIQUE唯一约束,它是保证某列的每行必须有唯一的值,这就是我们举例子中的,我们在填自己的相关信息的时候,总有一些东西是唯一的,为了不出问题,如身份证号,学生号,班级代号之类的列,都可以加上这个唯一约束。

我们继续用books表来做例子:

 create table books(id int unique,name varchar(50),price decimal(3,1),other varchar(20));//创建一个id为unique唯一的列

//增加数据
 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,'');//name中没有写数据

然后再次查一下我们的student表,发现已经有数据在里面了,并且在name中的值是?怎么是空的,什么都没有?难道是翻车了?别急,这里其实并不是我们没插入数据,只是没写数据,但还是输入了name的,我们输入中的name是空的,所以录入到表显示的时候也是空的:

如果我们想看一下默认值是怎么样的,我们只需要输入id就可以,并不需要录入name,其实在插入数据的时候,我们经常是insert into 表名 values(值,值);,但我们也可以在表名后面加上列名,这样就是指定插入哪一个列(如下面只插入id列),然后其他的就会是插入默认值:

insert into student(id) values(204026);//插入数据只写了id列数据

查询结果:

然后这样的默认匿名数据就插入成功拉。


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的增删改查(进阶版)了。欢迎关注。一起学习,共同努力!

还有一件事:

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恒等于C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值