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. 产生外键的约束:保证了数据的完整性。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Python酷玩之旅_mysql-connector

前言 Python作为数据科学、机器学习等领域的必选武器,备受各界人士的喜爱。当你面对不同类型、存储于各类介质的数据时,第一时间是不是要让它亮个相?做个统计,画个图表,搞个报表… 等等。 正如Java中的JdbcDriver一样…

高效驱动,掌控动力:TB67H400AFNG 马达驱动器

在如今智能设备和自动化应用领域中,驱动器的性能直接决定了系统的可靠性与效率。东芝的TB67H400AFNG有刷直流马达驱动器凭借其卓越的性能,成为众多行业解决方案中的关键部件。无论是工业控制、自动化设备还是消费类电子产品,TB67H400AFNG都能…

嵌入式综合实验平台-嵌入式综合实训实验箱

1、基本介绍 嵌入式综合实验平台(eeLab-BaseKit)是中智讯公司开发的一款信息类学科的综合型实验设备,配套丰富的教学实验和开发例程,可以满足电子信息工程专业的专业核心课程及专业方向课程的教学、实验和实训需求,包括《嵌入式接…

如何使用ssm实现基于VUE的儿童教育网站的设计与实现+vue

TOC ssm676基于VUE的儿童教育网站的设计与实现vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 LMS全称为Lite Memory Sanitizer,是一种实时…

基于单片机的精确电压表DA-AD转换

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DAC0832和ADC0832检测电压,0到8.5V,设计复位电路 LED管显示实际稳压值,初始电压0 二、硬件资源 基于KEIL5编写C代码&#xff0c…

regPractice-正则表达式练习

正则表达式练习(java) 1 . 校验密码强度 密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。 ^(?.*\d)(?.*\[a-z])(?.*[A-Z])[a-zA-Z\d]{8,10}$**(?pattern)**属于正向前瞻断言 正向前瞻断言的语法是 (?pattern)&a…

【React与Vue】如何在页签中监听 LocalStorage 变化?这些方法你都试过吗?

在开发中,你是否会碰到过这样的需求:需要监听 LocalStorage 的变化。这在不同浏览器页签间是相对简单的,因为浏览器提供了内置的 storage 事件。但在同一个浏览器页签下,却没有直接的方式实现。今天,我们探讨下有几种高…

化工企业如何精准网络营销

合作咨询联系竑图 hongtu201988 网络推广已成为各行各业不可或缺的一部分,尤其是化工企业,其产品的专业性和复杂性更需要通过有效的网络推广手段来触达目标客户群体。以下是一份针对化工企业的网络推广方案,旨在通过多渠道的营销策略&#x…

【机器学习】---元强化学习

目录 1. 元学习简介1.1 什么是元学习?1.2 元学习的应用 2. 强化学习基础2.1 什么是强化学习?2.2 强化学习的基本框架2.3 深度强化学习 3. 元强化学习的概念与工作原理3.1 元强化学习是什么?3.2 元强化学习与普通强化学习的区别 4. 元强化学习…

Google 提供基于AI的模糊测试框架

人工智能驱动的 OSS-Fuzz 工具可以帮助发现漏洞,并与自动修补管道相结合。 模糊测试可以成为找出软件中零日漏洞的宝贵工具。为了鼓励开发人员和研究人员使用它,谷歌周三宣布,免费提供其模糊测试框架OSS-Fuzz。 根据谷歌的说法,通…

初学51单片机之I2C总线与E2PROM

首先先推荐B站的I2C相关的视频I2C入门第一节-I2C的基本工作原理_哔哩哔哩_bilibili 看完视频估计就大概知道怎么操作I2C了,他的LCD1602讲的也很不错,把数据建立tsp和数据保持thd,比喻成拍照时候的摆pose和按快门两个过程,感觉还是…

什么是SSL证书?它能保护你的网络安全!

相信大家在浏览网页时经常会看到一些网址前面有个“小锁”图标,它代表的网站是安全的,而这背后的秘密就是SSL证书。那SSL证书到底是什么?它有什么用呢? 什么是SSL证书? SSL证书的全称是Secure Sockets Layer证书&…

C/C++指针的前世今生

前言 老早之前就想写这个内容了,打了草稿后闲置了两个月,因为其他事就没再动过这个东西了,今天翻草稿箱的时候发现了它,就把它完善出来,顺便我也学习学习。 正文 指针的前世今生 前面先说一下,故事是随…

Linux文件IO(十一)-复制文件描述符与截断文件

1.复制文件描述符 在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新的文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和旧的文件描述符拥…

想转行AI大模型开发但不知如何下手?看这篇就够了!

原创 最近有很多小伙伴问我,之前从事的其他领域的编程,现在想要学习AI大模型开发的相关技能,不知道从哪下手,应该学习些什么,下面四个是我认为从事大模型开发,必须掌握的四个开源工具,大家可以…

2024年模式识别与图像分析国际学术会议(PRIA 2024)

2024年模式识别与图像分析国际学术会议(PRIA 2024) 2024 International Conference on Pattern Recognition and Image Analysis 2024年10月18-20日 南京 三轮截稿日期:10月10日 2024年模式识别与图像分析国际学术会议(PRIA 2…

流水线部署失败排查指南

在现代软件开发中,CI/CD(持续集成/持续交付)流水线是确保代码质量和快速交付的重要工具。然而,部署失败时,排查问题的能力至关重要。以下是一些常见的故障排查步骤和技巧。 ## 1. 检查流水线日志 首先,查看…

【JAVA-数据结构】时间空间复杂度计算案例

接着上一篇文章&#xff0c;对应举一些例子。 1.时间复杂度 【实例1】 // 计算func2的时间复杂度&#xff1f; void func2(int N) {int count 0;for (int k 0; k < 2 * N ; k) {count;} int M 10;while ((M--) > 0) {count;} System.out.println(count); } 基本操作…

什么是远程过程调用(RPC)

进程间通信(IPC) 进程间通信(Inter-Process Communication)是指两个进程或者线程之间传送数据或者信号的一些技术或者方法。进程是计算机进行资源分配的最小的单位。每个进程都有自己独立的系统资源,而且彼此之间是相对隔离的。为了使得不同的进程之间能够互相访问,相互协…