当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL中常见的六个约束类型详解

MySQL中常见的六个约束类型详解

来源:脚本之家 2022-12-29 10:53:26 0浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《MySQL中常见的六个约束类型详解》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

约束类型是通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。这一章我们主要介绍六个常见的MySQL约束类型。

1. not null

保证指定不能存储NULL值,如果插入NULL则插入失败。

我们定义两张数据表,分别是student表和student_copy表,student表设定相关约束,student_copy表作为其对照表,不设置任何约束来观察两者的区别。

student表中id定义了not null,所以id这一行的NULL = NO,意思是这一行数据不能为NULL,否则会插入失败。

student_copy表中没有进行任何约束,所以任何字段的NULL = YES,意味着用户可以随意插入空值而不会报错。

Q:not null约束下除了显式的指定插入NULL会报错外,隐式的NULL会报错吗?

NULL指定有两种方式,分别是显式和隐式。

显式指的是插入时设定该列为NULL,而隐式指的是插入时对该列没有赋值,而这一列又没有指定默认值,系统默认的默认值是NULL,所有这中情况下也会触发插入控制的错误。

2. unique

保证某列的每行必须有唯一的值,也就是说,指定列的每行数据都不能重复。

下面两张图分别是对student表和student_copy表的操作,student表的id列设置了unique约束,所以在插入同样的id = 1时会显示重复操作。

student_copy表中没有进行任何约束,意味着用户可以随意插入任意值而不会报错。

Q:unique约束下插入NULL值会报错吗?

其实这个问题在刚才已经操作过了,student表中插入id = NULL,系统并不会报错。unique只是保证存储的值唯一,它可以是空值,但空值也得唯一,再插入NULL就会报错。

3. default

规定没有给列赋值时的默认值,换句话说就是,插入数据时没有给指定列的值,那么其值就是defalut指定的默认值。

student表指定了name字段设置了default约束之后,default这一列就有了名字。当插入数据时,没有指定name这一列,那么name这列就会按照我们设置的默认值 = '未命名'来填充。

而student_copy表没有设置default约束,所以当插入数据时,没有指定的列会按照系统默认的默认值来填充,也就是NULL。

4. primary key

not null + unique 的结合,保证某列具有唯一标识且不能存储NULL值。

前几个约束类型都是可以同时给多个列设置的,但是primary key一张表中只有能约束一列,使用primary key约束的列被称为主键

和unique类型,插入的数据如果重复了,那么后一条数据会插入失败,并且插入的数据不能为NULL。

一个表中只能由一列时主键,不能同时有多列是主键。设计表的时候,一般最好设定一个主键,常见的主键都是数字形式的。

自增主键auto_increment

在实际开发中,往往有一系列的策略来保证主键不重复,最常见的方法就是设置自增主键,系统可以自动给数据分配,用户也可以同时手动进行干预,因为MySQL中内置了自增主键功能,所以使用非常简单.

下图中id这一列就变成了自增主键,用户在插入数据时,就可以不必手动干预了.

Q:执行以下操作,猜想该表的查询结果是什么?

已知Id字段设置为自增主键.

张三的id = null,由于自增主键按照顺序它的id = 1;李四的id = 1,主键不能重复,李四的id和张三的id重复,所以插入失败;继续插入李四数据,此时设置id = 4,没有和原有数据重复,所以插入成功;王五的id = null,按照自增主键接着上一个顺序往下走,所以它的id = 5;

那么我们来看一下结果:

 

5. foreign key

外键用于关联其他表的主键,保证一个表中的数据匹配另一个表中的值的参照完整性。

foreign key (字段名) references 主表(列)

下面我们举个例子来理解下,我们现在创建两张表并想把它们关联起来,应该如何操作呢?

首先思考一下这个对应关系,一个学生对应一个班级,一个班级对应多个学生.在学生表中id为主键,那我们可以设置学生class_id为外键,去关联比班级表.

创建班级表class,设置classsId为主键

create table class (
 id int primary key auto_increment,
 name varchar(20)
);

创建学生表student,设置id为主键

create table student (
 id int primary key auto_increment,
 name varchar(20),
 class_id int,
 foreign key (class_id) references class(id)
);

MUL表示外键约束;

外键的使用规则

学生表中的插入的班级Id,必须在班级表中存在;

班级表是空的,这个时候插入学生表数据并给class_id = 1,而班级号在班级表中是空的,所以插入失败.学生表指定的这个外键约束,必须是班级表的主键;外键约束建立好了以后,此时班级表中的班级id就不能再随意修改或删除;

我们无法将班级表中id = 1的记录修改为id = 20,因为学生表中的张三依赖于班级表id = 1这样的结果.

外键的缺点

加入假如我们有下面这样一个商品-订单关联的两张表

此时我们可以使用订单表中的商品id和商品表中的商品id建立外键约束,但是当订单表中有了一个商品Id为1的记录时,就无法删除商品表中的id = 1的记录了,那么这个数据就会持久的存下去,但是商品不一定永久存在,很有可能就下架了,这就是外键在关联某些表时的矛盾所在.

如果我们既希望拥有外键约束的校验功能,同时也希望可以解决当前的矛盾,那么我们可以进行逻辑删除:给商品单独添加一列,标识数据是否有效,设定flag = 1表示记录有效,flag = 0表示记录无效.需要删除的商品,可以直接把它的标识改为0,逻辑上标识已经删除了该商品,但实际上该数据还在表中存储,并不是真正意义上的物理删除.

6. check

保证列中的值符合指定的条件。

总结

以上就是《MySQL中常见的六个约束类型详解》的详细内容,更多关于mysql的资料请关注golang学习网公众号!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
Docker启动mysql配置实现过程Docker启动mysql配置实现过程
上一篇
Docker启动mysql配置实现过程
MySQL 8中新增的这三大索引 隐藏、降序、函数
下一篇
MySQL 8中新增的这三大索引 隐藏、降序、函数
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    96次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    89次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    107次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    98次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    98次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码