【MySql】数据库的约束

写在最前面的话

        哈喽,宝子们,今天给大家带来的是MySql数据库的约束,约束是自动的对数据的合法性进行校验检查的一系列机制,目的就是为了保证数据库中能够避免被插入/修改非法的数据。因为有的时候数据库中的数据是有一定要求的,有些数据是合法数据,有些数据是非法数据,这个时候我们就需要校验了。接下来让我们一起进入学习吧,感谢大家的支持!喜欢的话可以三连哦~~~

目录

一、约束类型

二、NULL约束

三、UNIQUE:唯一约束 

四、DEFAULT:默认值约束

五、PRIMARY KEY:主键约束

六、FOREIGN KEY:外键约束

七、CHECK约束(了解)


 一、约束类型

我们先来整体认识下有哪些类型?大概有什么作用?然后一个个来刨析。

表格说明:

类型说明
NOT NULL指示某列不能存储 NULL 值。
UNIQUE保证某列的每行必须有唯一的值。
DEFAULT规定没有给列赋值时的默认值。
PRIMARY KEYNOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标
识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK保证列中的值符合指定的条件(MySql5不支持)。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。

二、NULL约束

        当我们新建一张表的时候,可以给字段插入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指定某字段唯一(如图二所示),当字段数据输入重复会报错。字段指定唯一的时候,无论插入/修改都无法添加重复的数据,因为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约束对比

四、DEFAULT:默认值约束

        默认值约束是规定了没有给列赋值时的默认值。如果不规定这一默认值的话,当没有给列插入数据的时候,默认值为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:主键约束

        主键约束是众多约束当中最重要的,它是一行记录的身份标识。一张表里的记录只能有一个作为身份标识的数据,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语句后,运行结果如图七所示:

  图七:手动指定自增主键数据

六、FOREIGN KEY:外键约束

外键用于关联其他表的主键唯一键,描述两个表之间的关联关系,存在父表与子表,父表约束子表,如下图八所示。

图八:父表子表约束关系

语法:

--子表中使用
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语句后,结果分析如图九所示:

图九:案例结果分析

外键拓展知识:

        针对父表进行修改/删除操作,如果当前被修改/删除的值已经被子表引用,这样操作也会失败。因为外键约束始终要保持,子表中的数据在对应的父表的列中要存在(如图十所示)。删除表的时候也要先删子表再删父表。

 

图十:“言传身教”

七、CHECK约束(了解)

MySQL使用时不报错,但忽略该约束。

学习案例:

create table test_user (
id int,
name varchar(20),
sex varchar(1),
check (sex ='男' or sex='女')--约束性别要么是男,要么是女
)

       希望各位读者阅读后都能有所收获,如果喜欢本篇博客的可以点赞+关注+收藏!!!同时也欢迎各位大神如果在阅读过程中发现文章有错误也可私信指正错误,我们下一篇博客再见~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/99665.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android中的view绘制流程,简单理解

简单理解 Android中的View类代表用户界面中基本的构建块。一个View在屏幕中占据一个矩形区域、并且负责绘制和事件处理。View是所有widgets的基础类,widgets是我们通常用于创建和用户交互的组件,比如按钮、文本输入框等等。子类ViewGroup是所有布局&…

视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查的相关问题及解决方法2.0

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多…

flask使用Flask-Mail实现邮件发送

Flask-Mail可以实现邮件的发送,并且可以和 Flask 集成,让我们更方便地实现此功能。 1、安装 使用pip安装: $ pip install Flask-Mail或下载源码安装: $ git clone https://github.com/mattupstate/flask-mail.git $ cd flask-…

ClickHouse配置Hdfs存储数据

文章目录 背景配置单机配置HA高可用Hdfs集群性能测试统计trait最多的10个trait term统计性状xxx minValue > 500 0000的数量结论 参考文档 背景 由于公司初始使用Hadoop这一套,所以希望ClickHouse也能使用Hdfs作为存储 看了下ClickHouse的文档,拿Hdf…

HyperDock 1.8.0.10(Dock优化工具)

HyperDock 是一款为 macOS 设计的实用工具,它提供了许多方便快捷的功能,使您能够更高效地管理和操作应用程序窗口。 首先,HyperDock 提供了类似于 Windows 7 的任务栏预览功能。当您将鼠标悬停在应用程序图标上时,会显示该应用程…

flutter 上传图片并裁剪

1.首先在pubspec.yaml文件中新增依赖pub.dev image_picker: ^0.8.75 image_cropper: ^4.0.1 2.在Android的AndroidManifest.xml文件里面添加权限 <activityandroid:name"com.yalantis.ucrop.UCropActivity"android:screenOrientation"portrait"andro…

Spring-mvc的参数传递与常用注解的解答及页面的跳转方式---综合案例

目录 一.slf4j--日志 二.常用注解 2.1.RequestMapping 2.2.RequestParam 2.3.RequestBody 2.4.PathVariable 三.参数的传递 3.1 基础类型 3.2 复杂类型 3.3 RequestParam 3.4 PathVariable 3.5 RequestBody 3.6 增删改查 四.返回值 4.1 void 返回值 4.2 String 返…

Elsaticsearch倒排索引

搜索引擎应该具有什么要求&#xff1f; 查询快 高效的压缩算法 快速的编码和解码速度 结果准确 BM25 TF-IDF 检索结果丰富 召回率 面向海量数据&#xff0c;如何达到搜索引擎级别的查询效率&#xff1f; 索引 帮助快速检索以数据结构为载体以文件形式落地 倒排…

手把手教你写一个简单的ioc容器

Ioc IOC&#xff08;控制反转&#xff09; 就是 依赖倒置原则的一种代码设计思路。就是把原先在代码里面需要实现的对象创建、对象之间的依赖&#xff0c;反转给容器来帮忙实现。 Spring IOC容器通过xml,注解等其它方式配置类及类之间的依赖关系&#xff0c;完成了对象的创建和…

微服务-gateway基本使用

文章目录 一、前言二、gateway网关1、什么是微服务网关&#xff1f;2、微服务架构下网关的重要性2.1、没有网关2.2、有网关 3、gateway的功能4、gateway实战4.1、依赖配置4.2、添加网关配置4.3、添加网关启动类4.4、查看项目是否启动成功4.5、验证路由配置是否正确 三、总结 一…

报错:axios发送的所有请求都是404

axios发送的所有请求都是404 一、问题二、分析三、解决一、问题 对后台发送数据请求接口,在 Swagger 上是可以请求到的 但是通过 Ajax 发送请求就会报 404 Swagger 上调用如下 项目接口请求如下

react16之前diff算法的理解和总结

此篇文章所讨论的是 React 16 以前的 Diff 算法。而 React 16 启用了全新的架构 Fiber&#xff0c;相应的 Diff 算法也有所改变&#xff0c;本片不详细讨论Fiber。 fiber架构是为了支持react进行可中断渲染&#xff0c;降低卡顿&#xff0c;提升流畅度。 react16之前的版本&…