5.MySQL表的约束

目录

  • 表的约束
    • 空属性(非空约束)
    • 默认值(default约束)
    • 列描述(comment)
    • zerofill
    • 主键(primary key约束)
    • 自增长(auto_increment)
    • 唯一键(unique约束)
    • 外键

表的约束

如果我自由自在的去往文件里写数据的话,你可以写整数,浮点数,类型写错了都没问题,你想怎么写就怎么写,这叫没约束, 有约束才是好的,能将错误给你暴露出来,就和我们平常写代码一样写错时会编译报错一样。
表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束本质是通过技术手段倒逼程序员,插入正确的数据。反过来,站在程序员使用数据的时候,就不用担心数据是否不符合预期,是否不正常,凡是在插入进来的数据,都是符合数据约束的

约束的最终目的:保证数据的完整性和可预期性
表的约束有很多,这里主要介绍如下几个:null/not null,default,comment,zerofill,primary_key,auto_increment,unique_key。

空属性(非空约束)

在学C/C++的时候整数0和’\0’和NULL在数字上都是0,但在mysql中表示没有,在mysql中单引号双引号都表示字符串,我们一般写为单引号,''表示空串,这表示有,但为空串,而NULL表示没有。

null不参与运算
示例:
在这里插入图片描述
数据库插入时默认字段为null空,但是实际开发时,尽可能保证字段不为空not null,因为数据为空没办法参与运算。

案列:创建一个班级表,包含班级名和班级所在的教室
站在正常的业务逻辑中:

  • 如果班级没有名字,你不知道你在哪个班级
  • 如果教室名可以为空,就不知道在哪上课

所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。
在这里插入图片描述
我们other属性列没有写default null,但查看的时候有,这是因为mysql对我们的雨具做了重新调整和优化。
在这里插入图片描述
站在用户角度设置了not null能拦住插入控制,站在mysql的角度,有not null的列属性未来一定有具体的值。

默认值(default约束)

默认值:某一种数据会经常的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

示例:插入一个人的信息性别的时候,默认值设为男,如果你插入时指定了性别为女,则为女。
在这里插入图片描述
不指定性别,默认插入为男。

如果一个属性列既设定为not null 又设定为default,是否冲突?
在这里插入图片描述
发现某一属性列设置了not null,mysql就不会自动优化default null添加默认值。

在这里插入图片描述
结论:default和not null并不冲突,而是互相补充的。当用户想插入的时候,插入NULL,被非空约束着;当用户没有插入的时候,因为没有设置默认值,报错了,被default约束着。

列描述(comment)

comment,专门用来描述的字段。
在这里插入图片描述
这个字段的约束在哪里呢?这是一种软约束,程序员能根据这个描述大概能知道应该插入什么数据。

zerofill

在这里插入图片描述
建表的时候圆括号里面写了10,这个10代表什么意思呢?其实没有zerofill这个属性,括号内的数字是毫无意义的。
在这里插入图片描述
zerofill的作用:如果宽度小于设定的宽度,自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是2,0000000002知识设置了zerofill属性后的一种格式化输出而已。

主键(primary key约束)

primary key用来约束某一字段,该字段不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

示例:
在这里插入图片描述
可以看到mysql对我们的语句进行了优化
在这里插入图片描述
主键插入了相同的值,报错了。
对于程序员来讲:你插入的数据不能重复,重复了/冲突了不让你插入,倒逼程序员插入的时候不重复。站在mysql的角度,这个表里面的主键数据一定是不冲突的。

一张表中最多只能有一个主键,不意味着一个表中的主键只能添加给一列,一个主键也可以添加到多列上。这也叫做复合主键。
在这里插入图片描述
这两个合起来才称为主键,只有这两个同时相等才会报错。
在这里插入图片描述

自增长(auto_increment)

auto_increment:当对应的字段插入时不给值,系统会自动插入一个值,这个值是当前字段中已有的最大值+1。通常和主键搭配使用,作为逻辑主键。

自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长

示例:
在这里插入图片描述
我们没有插入id属性这一列,自增的插入了。
在这里插入图片描述
mysql给我们的语句优化:显示的是下一次auto_increment将要插入的值为多少

有些时候我想修改表下次自动插入的值,就需要修改auto_increment,怎么修改呢?
语法:

ALTER TABLE your_table_name AUTO_INCREMENT = new_value;

示例:
在这里插入图片描述
为什么没有修改成功?
注意:你想设置的AUTO_INCREMENT的值必须要大于当前表中最大的ID值。否则MySQL会忽略这个命令,因为AUTO_INCREMENT值必须是唯一的且递增的。
在这里插入图片描述

主键是和索引强相关的。索引是什么?索引是加速mysql查找的技术策略,比如有一本书,有800页,你要找到多线程的那一页,如果不看目录,你就只能线性遍历,效率是很低的。
目录本质上是key(页数)value(主题)的结果。目录的作用是加速我们快速的去定位某一个内容,因为多花了20页的纸来保存目录,花更多的时间以提高我们查找效率。索引的本质就是以空间换时间。
后面会有专门的章节来讲索引。这里做个预备,方便之后更易理解。

唯一键(unique约束)

先直接上示例:
在这里插入图片描述
插入相同的失败了,意料之中。
在这里插入图片描述
发现可以插入NULL,并且多个NULL也不会冲突。为什么呢?因为NULL不参与运算,怎么比较运算都返回NULL。
与主键不同,主键不能插入NULL,并且主键一个表中只能有一个,而唯一键可以有多个。

主键和唯一键都表示唯一性,那我建表时应该如何选择呢?
建表的本质就是来描述一个对应的对象,mysql的表就相当于C/C++中的结构体,来描述抽象的事物,一个人是有很多的属性,从一个人身上的众多唯一键属性的一列挑一个作为我们的主键,比如一个人有身份证,有学号,在社会中可以选择身份证作为主键,在学校可以将学号作为主键,但是他们都具有唯一性。这就是他们之间的关系。

在这里插入图片描述
电话两个人是一样的,在现实生活中这是不合理的。主键保证了唯一性,但其他的属性不代表不需要唯一性,以防这种情况出现,就需要唯一键来约束。

关于唯一键和主键的区别:
我们可以简单理解成,主键更多的是标识唯一性,而唯一键更多的是保证在业务上,不要和别的信息出现重复。

外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主见约束或unique约束。当定义外键后,要求外键列数据必须在主键的主键列存在或外键为null。

示例1:
在这里插入图片描述
如果将班级表中的数据都设计在每个学生表的后面,那就会出现数据冗余,所以我们只要设计成这样就能将班级信息和学生信息分开,并且也形成了关联关系。

在这里插入图片描述
在这里插入图片描述
这是不合理的,没有class_id为3的班级,却插入成功了。
在这里插入图片描述
这也是不合理的,class_id为1的班级还有学生,却能直接删除了,这些学生已经悬空了,不属于任何班级了。

如何解决上述的问题呢?上面之所以引发这些问题,就是因为没有约束,所以我们要构建外键约束。
在这里插入图片描述
在这里插入图片描述
发现之前的操作,现在都被拦截了。这就是外键的约束,

外键的两方面的概念:

  1. 主表和从表产生关联关系:使两个表产生了联系。
  2. 产生外键的约束:保证了数据的完整性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据集-目标检测系列-鲨鱼检测数据集 shark >> DataBall

数据集-目标检测系列-鲨鱼检测数据集 shark >> DataBall 数据集-目标检测系列-鲨鱼检测数据集 shark 数据量:6k 数据样例项目地址: gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview github: https://github.com/Te…

开启争对目标检测的100类数据集-信息收集

DataBall 助力快速掌握数据集的信息和使用方式。 目标检测项目数据集样例地址: gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview github: https://github.com/TechLinkX/DataBall-detections-100s 请关注我们的专栏:DataBal…

Excel 绝对值怎么求?ABS 函数用法详解

大家好,这里是效率办公指南! 📊 ABS函数在Excel中用于计算数值的绝对值,这在处理财务、科学和日常办公等领域的数据时非常有用。今天,我们将通过一些具体的日常工作案例,来展示ABS函数的实际应用。 ABS函…

《深度学习》自然语言处理 统计、神经语言模型 结构、推导解析

目录 一、语言转换方法 1、如何将语言转换为模型可以直接识别的内容 1)数据预处理 2)特征提取 3)模型输入 4)模型推理 二、语言模型 1、统计语言模型 1) 案例: • 运行结果: • 稀疏…

BAAI 团队发布多模态模型 Emu3

在人工智能的浩瀚海洋中,一艘名为Emu3的创新之船正在破浪前行,为我们展示了多模态AI的无限可能。这个由Meta AI研究团队开发的革命性模型,通过简单而巧妙的"下一步预测"机制,实现了文本、图像和视频的统一处理。 Emu3的…

linux服务器部署filebeat

# 下载filebeat curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.23-linux-x86_64.tar.gz # 解压 tar xzvf filebeat-7.17.23-linux-x86_64.tar.gz# 所在位置(自定义) /opt/filebeat-7.17.23-linux-x86_64/filebeat.ym…

k8s StorageClass 存储类

文章目录 一、概述1、StorageClass 对象定义2、StorageClass YAML 示例 二、StorageClass 字段1、provisioner(存储制备器)1.1、内置制备器1.2、第三方制备器 2、reclaimPolicy(回收策略)3、allowVolumeExpansion(允许…

探索基于知识图谱和 ChatGPT 结合制造服务推荐前沿

0.概述 论文地址:https://arxiv.org/abs/2404.06571 本研究探讨了制造系统集成商如何构建知识图谱来识别新的制造合作伙伴,并通过供应链多样化来降低风险。它提出了一种使用制造服务知识图谱(MSKG)提高 ChatGPT 响应准确性和完整…

告别背锅侠!29个空场景及测试方法的实战指南

想必大家在日常的测试工作中,经常会碰到以下这些场景: 场景一: 测试人员:有一个数据为空的场景还没有验证。 研发人员:这个场景不会出现,因为没有删除逻辑。 场景二: 研发人员:…

蓝桥杯模块二:数码管的静态、动态实现

模块二训练 1.静态显示 一、数码管电路图 二、电路分析 1.数码管电路分析 端口分公共端和段码,先用公共端控制一个数码管,再用段码实现显示数字。共阳数码管公共端输入高电平,段码输入低电平实现点亮 2.锁存器 Y7控制段码,Y6控…

【含文档】基于Springboot+微信小程序 的中心医院用户移动端(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

全志科技发布T536高性能智慧工业芯片,飞凌嵌入式率先推出配套核心板

2024年9月24日下午,全志科技在中国国际工业博览会上成功举办了其最新产品——T536高性能智慧工业芯片的全球首发发布会。这款芯片采用创新的4核Cortex-A55与RISC-V混合架构,主频分别达到1.6GHz和600MHz,并集成了2TOPS算力的NPU,吸…

生信初学者教程(四):软件

文章目录 RRstudioLinux系统其他软件本书是使用R语言编写的教程,用户需要下载R和RStudio软件用于进行分析。 版权归生信学习者所有,禁止商业和盗版使用,侵权必究 R R语言是一种免费的统计计算和图形化编程语言,是一种用于数据分析和统计建模的强大工具。它具有丰富的统计…

耦合微带线单元的网络参量和等效电路公式推导

文档下载链接:耦合微带线单元的网络参量和等效电路资源-CSDN文库https://download.csdn.net/download/lu2289504634/89583027笔者水平有限,错误之处欢迎留言! 一、耦合微带线奇偶模详细推导过程 二、2,4端口开路 三、2端口短路、3端口开路 四…

智能密码、指纹锁语音芯片ic方案 可存放40s语音内容 NVD语音芯片

随着科技的飞速发展,智能家居安全领域迎来了前所未有的变革。智能密码与指纹锁作为现代家庭安全防护的重要一环,其背后的语音芯片IC开发更是这一变革中的关键技术突破。 智能密码、指纹锁语音芯片ic方案 选型与简介: NVD语音芯片是一款低成…

quiz: python网络爬虫之规则1

下面答错了: B c 8A, 9A

STM32F407之超声波模块使用

#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "HC_SR04.h"int main() {OS_ERR err;//错误uart_init(9600);//串口初始化//超声波初始化HC_SR04();//OS初始化 他是第一个运行的函…

【大数据】数据中台怎么样助力企业创新和客户实践

在当今数字化时代,数据成为了企业竞争的关键因素。企业拥有大量的数据,但如何高效地利用这些数据,实现创新和提升客户体验,成为了一项重要的挑战。数据中台作为一种重要的数据管理和分析工具,发挥着关键的作用。本文将…

大数据毕业设计选题推荐-食品销售数据分析系统-Hive-Hadoop-Spark

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

数集相等定义凸显“R各元x的对应x+1的全体=R”是几百年重大错误

黄小宁 变量x所取各数也均由x代表,x代表其变域(x所有能取的数组成的集)内任一元。设集A{x}表A各元均由x代表,{x}中变量x的变域是A。其余类推。因各数x可是数轴上点的坐标所以x∈R变换…