写在最前面的话
哈喽,宝子们,今天给大家带来的是MySql数据库的约束,约束是自动的对数据的合法性进行校验检查的一系列机制,目的就是为了保证数据库中能够避免被插入/修改非法的数据。因为有的时候数据库中的数据是有一定要求的,有些数据是合法数据,有些数据是非法数据,这个时候我们就需要校验了。接下来让我们一起进入学习吧,感谢大家的支持!喜欢的话可以三连哦~~~
目录
一、约束类型
二、NULL约束
三、UNIQUE:唯一约束
四、DEFAULT:默认值约束
五、PRIMARY KEY:主键约束
六、FOREIGN KEY:外键约束
七、CHECK约束(了解)
我们先来整体认识下有哪些类型?大概有什么作用?然后一个个来刨析。
表格说明:
类型 | 说明 |
NOT NULL | 指示某列不能存储 NULL 值。 |
UNIQUE | 保证某列的每行必须有唯一的值。 |
DEFAULT | 规定没有给列赋值时的默认值。 |
PRIMARY KEY | NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标 识,有助于更容易更快速地找到表中的一个特定的记录。 |
FOREIGN KEY | 保证一个表中的数据匹配另一个表中的值的参照完整性。 |
CHECK | 保证列中的值符合指定的条件(MySql5不支持)。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。 |
当我们新建一张表的时候,可以给字段插入NULL值,但是有时候需求是不可以加NULL值进去,这个时候我们就需要在建表的时候给表中的数据添加NULL约束,not null可以指定某列不为空(如图一所示),当指定某列不为空的时候,无论插入/修改都无法改为空。
语法:
create table 表名(列名 数据类型 not null,...);
学习案例:
没添加NULL约束
create table student(id int ,name varchar(20) );--创建数据表 insert into student values(null,null);--插入测试数据 select * from student;--查询student表内容
添加NULL约束
--创建添加NULL约束的数据表 create table student(id int not null,name varchar(20) not null); --插入测试数据 insert into student values(null,null);
执行上述SQL语句后,对比如图一所示:
图一:有无not null约束对比
唯一约束是为了限制某个字段数据不重复。如果没添加这个约束的话,有时候可能将数据输入重复不会报错。如果要求某一字段不能有重复数据,可以使用unique指定某字段唯一(如图二所示),当字段数据输入重复会报错。字段指定唯一的时候,无论插入/修改都无法添加重复的数据,因为unique在后续插入/修改数据的时候都先触发一次查询操作,通过这个查询来确定当前记录是否已经存在。
语法:
create table 表名(列名 数据类型 unique,...);
学习案例:
没添加UNIQUE约束
create table student(id int ,name varchar(20));--创建数据表 insert into student values(1,'李四');--插入测试数据1 insert into student values(1,'李四');--插入测试数据2 select * from student;--查询测试表的字段内容
添加UNIQUE约束
create table student(id int unique,name varchar(20) unique);--创建数据表 insert into student values(1,'李四');--插入测试数据1 insert into student values(1,'李四');--插入测试数据2
执行上述SQL语句后,对比如图二所示:
图二:有无unique约束对比
默认值约束是规定了没有给列赋值时的默认值。如果不规定这一默认值的话,当没有给列插入数据的时候,默认值为NULL(如图三所示),当创建表的时候给某列字段指定默认值,即使没有插入该列数据,也会显示设置的默认值(如图四所示)。
语法:
create table 表名(列名 数据类型 default 指定默认值,...);
学习案例:
没添加DEFAULT约束:
create table student(id int ,name varchar(20));--创建数据表 desc student;--查看数据表结构 insert into student(id) values (1);--插入测试数据1 select * from student--查询数据表内容 insert into student(id) values (2);--插入测试数据2 select * from student--查询数据表内容
执行上述SQL语句后,运行结果如图三所示:
图三:没有添加default约束
添加DEFAULT约束:
create table student(id int ,name varchar(20) default'未命名');--创建default约束的数据表 desc student;--查看数据表的结构 insert into student(id) values (1);--插入测试数据1 select * from student--查询数据表的内容 insert into student values (2,'lisi');--插入测试数据2 select * from student--查询数据表的内容
执行上述SQL语句后,运行结果如图四所示:
图四:添加default约束
主键约束是众多约束当中最重要的,它是一行记录的身份标识。一张表里的记录只能有一个作为身份标识的数据,primary key约束也是not null约束与unique约束的结合体,设置了主键约束的列不能重复插入/修改数据,也不能为NULL(如图五)。
语法:
create table 表名(列名 数据类型 primary key,...);
学习案例:
create table student(id int primary key,name varchat(20));--创建包含主键的数据表
desc studnet;--查看数据表结构
insert into student values(1,'lisi');--插入测试数据
insert into student values(1,'wangwu');--插入测试数据。报错,主键字段数据重复
insert into student values(null,'sunliu');--插入测试数据。报错,主键字段不为空
执行上述SQL语句后,运行结果如图五所示:
图五:添加primary key约束
5.1、自增主键
MySql提供了一种“自增主键”的机制来保证主键唯一,每当插入数据的时候,不必手动指定主键的值,有数据库服务器自动分配一个主键,会从1开始(也可手动指定),依次递增分配主键的值。如果手动指定数值的话,下一个自增的述职就从最大的数值开始继续往后分配。
语法:
create table 表名(列名 数据类型 primary key auto_increment,...);
学习案例1:
--创建包含自增主键数据表
create table student(id int primary key auto_increment,name varchar(20));
desc student;--查看数据表结构
--此处插入测试数据的id设为null是因为我们不手动指定,交由数据库指定
insert into student values(null,'student');
insert into student values(null,'lisi');
insert into student values(null,'wangwu');
select * from student;--查看数据表内容
执行上述SQL语句后,运行结果如图六所示:
图六:添加自增主键
学习案例2:
insert into student values(8,'sunliu');--手动指定自增主键数据
insert into student values(null,'huangqi');--不手动指定自增主键数据,观察数据库分配
select * from student;--查看数据表结构
执行上述SQL语句后,运行结果如图七所示:
图七:手动指定自增主键数据
外键用于关联其他表的主键或唯一键,描述两个表之间的关联关系,存在父表与子表,父表约束子表,如下图八所示。
图八:父表子表约束关系
语法:
--子表中使用
create table 子表名(列名 数据类型,foreign key (子表列) references 父表(父表列));
注意:指定外键约束的时候,要求父表中被关联的这一列必须是主键或者唯一键。
学习案例:
--创建父表
create table class(classId int primary key,name varchar(20));
--插入父表数据,用于约束子表
insert into class values(100,'java1'),(101,'java2'),(102,'c++'),(103,'c++');
--创建子表并关联父表
create table student(id int,name varchar(20),classId int,foreign key(clssId)
references class(classId));
--子表插入数据验证
insert into student values(1,'李四',100);--classID在父表中存在,插入成功
insert into student values(2,'王五',101);--classID在父表中存在,插入成功
------------------------------------------------------------------------
insert into student values(3,'张三',200);--报错!父表中classId不存在200
执行上述SQL语句后,结果分析如图九所示:
图九:案例结果分析
外键拓展知识:
针对父表进行修改/删除操作,如果当前被修改/删除的值已经被子表引用,这样操作也会失败。因为外键约束始终要保持,子表中的数据在对应的父表的列中要存在(如图十所示)。删除表的时候也要先删子表再删父表。
图十:“言传身教”
MySQL使用时不报错,但忽略该约束。
学习案例:
create table test_user (
id int,
name varchar(20),
sex varchar(1),
check (sex ='男' or sex='女')--约束性别要么是男,要么是女
)
希望各位读者阅读后都能有所收获,如果喜欢本篇博客的可以点赞+关注+收藏!!!同时也欢迎各位大神如果在阅读过程中发现文章有错误也可私信指正错误,我们下一篇博客再见~~~