开开心心带你学习MySQL数据库之第六篇上

在这里插入图片描述

​ 💮 💮💮 只要路是对的,就不害怕遥远! 💮 💮💮

🎆🎆🎆窗台是风景,笔下有前途,低头是题海,抬头是未来🎆🎆🎆

​ 🍂🍂🍂 如果没有躺赢的命,那就要站起来奔跑 🍂🍂🍂

  • not null => 要求元素非空
  • unique => 要求元素唯一
  • default => 指定默认值
  • primary => 主键 ~~自增主键,保证主键🆔不重复

自增主键

如果咱们的数据库是单机部署的.此时自增主键一般够用.

如果是分布式部署的,感兴趣的话,可以看这篇博客:分布式系统中唯一 ID 的生成方法


foreign key => 外键

用于关联其他表的主键或唯一键 \color{#00f}{用于关联其他表的主键或唯一键} 用于关联其他表的主键或唯一键

-- 语法
foreign key (字段名) references 主表 ()  -- 班级表, classId设置成一个自增主键
create table class(classId int primary key auto_increment, className varchar(20)
); -- 学生表, 使用studentId为主键,classesId为外键,关联班级表classId
create table student(studentId int primary key auto_increment,name varchar(20), classId int, foreign key (classId) references class(classId)
);

此时就要求 s t u d e n t 表中的每个记录的 c l a s s l d 得在 c l a s s 表的 c l a s s l d 中存在 ! ! ! \color{#F00}{此时就要求student表中的每个记录的classld得在class表的classld中存在!!!} 此时就要求student表中的每个记录的classld得在class表的classld中存在!!!

image-20230907154529763

student表受到class表的约束,就把class叫做student的父表(parent),student就是class的子表(child)

-- 向class表插入1班,2班,3班,4班
insert into class values(null,'1班');
insert into class values(null,'2班');
insert into class values(null,'3班');
insert into class values(null,'4班');-- 查看一下class表,看是否插入成功
select * from class;insert into student values(null,'张三',1);
-- 学生张三的插入过程
-- mysql就会先拿着这个记录的classld去class表中查一下看看有没有.
-- 得是有,才能完成后续的插入!!!如果没有,插入失败!!-- 看一下student表,看是否插入成功
select * from student;-- 更新失败,由于父表class对子表student的约束
updata student set classId = 10 where studentId = 1;

image-20230907154602117

当你凝视深渊的时候 , 深渊也在凝视你   \color{#0F0}{~~ 当你凝视深渊的时候,深渊也在凝视你 ~~}   当你凝视深渊的时候,深渊也在凝视你  

父表在约束子表的同时 , 子表也反向的约束了父表 \color{#0F0}{父表在约束子表的同时,子表也反向的约束了父表} 父表在约束子表的同时,子表也反向的约束了父表

image-20230907155137504

外键约束,针对子表是不能新增和修改 ~~新增和修改子表的数据不能超出父表的记录
父表是不能删除和修改 ~~已经被子表依赖的数据是不能被删除掉的


思考题

电商类网站

商品表(id, name, price…)

订单表(orderld, userld, goodsld, time…)

问题:有一种情况,商品衬衫要下架!!!如何实现这个下架功能?如何把这个衬衫从商品表中删除掉??

答:给商品表加一列,表示是否下架
~~此时实现下架并非是 delete 记录,而是 update 把是否下架字段进行修改
~~逻辑删除 => (数据不是真删了,而是标记成"无效")
至于这个商品表里的记录会越来越多,那就加装硬盘就行了(硬盘空间不值钱)


表的设计

根据需求,把表应该是啥样的写出来.有几个表,每个表干啥的,每个表有几个字段,都是干啥的,都是啥类型,有啥约束…

设计表,分两步走

1.梳理清楚需求中的"实体"

2.梳理清楚实体之间的关系.

3.按照关系,带入到既定的公式中,表就出来了

教务管理系统需要实现的功能
要能管理所有的学生信息
要能管理所有的教师信息
要能管理所有的作业信息
要能管理所有的课程信息

上述表中的实体有: 学生 , 教师 , 作业 , 课程

实体中的关系,主要有三种(严格的说是四种)

1.一对一

​ 一个学生,只能有一个账号
​ 一个账号,只能供一个学生所有

如何设计表:

第一种: 弄一个大表,包含 账号信息 + 学生信息
账号和学生表:account_student (accountld, username, password, studentName…);
第二种: 弄两个表,相互关联
账号表:account (accountld, username, password, s t u d e n t l d \color{#F0A}{studentld} studentld);
学生表:student( s t u d e n t l d \color{#F0A}{studentld} studentld, name…);
第三种: 搞两个表(推荐)⭐️⭐️⭐️
account(accountId,username,password);
student(accountld,studentld, studentName);
后续可以弄一些教师表其它的,也能和account表关联

2.一对多

​ 一个班级可以包含多个学生

​ 一个学生只能处于一个班级

这种情况,也有两种典型的表示方式

第一种❌❌❌
student(studentld, name);
class(classld, className, studentldList)
studentldList => 用数组或者列表来保存学生🆔
mysql没有数组类型,不能这么搞❗️❗️❗️但是有些数据库,比如redis,是有数组类型的.此时就可以考虑这样设计~~ redis用途非常多,最核心的用途,就是做缓存(cache)
第二种⭐️⭐️⭐️ ~~ 最典型的一对多设计方式
class表 => class( c l a s s I d \color{#F0A}{classId} classId , className);
insert into class values(1, ‘1班’ );
insert into class values(2, ‘2班’ );
student表 => student(studentId , name, c l a s s I d \color{#F0A}{classId} classId);
insert into student values(1, ‘大白’ ,1 );
insert into student values(2, ‘大白’ ,2 );

3.多对多

​ 一个学生可以选择多个课程

​ 一个课程也可以提供给多个学生

student (studentId, name);
--			1		'初一'
--			2		'初二'
course (courseId, name);
--			1		'语文'
--			2		'数学'--	   '需要弄一个关联表'
student_course(studentId, courseId);
--					1		1
--					1		2
--					2		1
--  关联结果 => '初一'选了数学和语文
-- 			   '初二'选了语文
--			   '语文'这个课程提供给了'初一'和'初二'
--			   '数学'这个课程提供给了'初一'

4.没关系(可省略)


总结

一般来说,只要实体和关系都明确了,此时表的设计就基本差不多了~~
如果实体比较多,关系比较复杂,可以画一个“实体关系图"来表示这个关系~~
ER图~~学校数据库课程考试,一定有一道大题是画ER图!!
实际开发中,很少会画这个ER图~~ 即使画,也不必非得那么严格的遵守ER图的语法,大概画一下就行

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

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

相关文章

【BI看板】Superset时间过滤控件二次开发

有没有人发觉Superset时间过滤组件非常高级,😟但又有点复杂,没有选择时间区间的快捷方式。 Superset的时间过滤控件可以通过在代码中进行二次开发来进行定制。以下是一些可能有用的提示: 查找源代码:可以在Superset的源…

Redis之bigkey问题解读

目录 什么是bigkey? bigkey引发的问题 如何查找bigkey redis-cli --bigkeys MEMORY USAGE bigKey如何删除 渐进式删除 unlink bigKey生产调优 什么是bigkey? bigkey简单来说就是存储本身的key值空间太大,或者hash,list&…

意向客户的信息获取到底是怎样的,快来get一下

客户信息获取技术真的可以为企业提供精准客源吗?这个渠道到底安不安全,技术到底成不成熟?效果到底如何?下面简单的和大家分析一下。 客户信息获取技术是怎样的 手机采集引流方面,上量不精准,精准不上量的说…

浅探Android 逆向前景趋势~

前段时间,我和朋友偶然间谈起安卓逆向,他问我安卓逆向具体是什么,能给我们带来什么实质性的东西,我也和朋友大概的说了一下,今天在这里拿出来和大家讨论讨论,也希望帮助大家来了解安卓逆向。 谈起安卓逆向…

工作中提高CSS的编写效率,可以多用这三个CSS伪类

:where 基本使用 :where() CSS 伪类函数接受选择器列表作为它的参数&#xff0c;将会选择所有能被该选择器列表中任何一条规则选中的元素。 以下代码&#xff0c;文本都会变成 yellow 颜色 :where(div p) span {color: yellow; }<div class"test-div"><…

基于RabbitMQ的模拟消息队列之六——网络通信设计

自定义基于TCP的应用层通信协议。实现客户端对服务器的远程调用 编写服务器及客户端代码 文章目录 基于TCP的自定义应用层协议一、请求1.请求格式2.创建Request类 二、响应1.响应格式2.创建Response类 三、客户端-服务器交互四、type五、请求payload1.BasicAruguments(方法公共…

10、哈希函数与哈希表

哈希函数 出现次数最多的 32G 小文件方法&#xff1a;利用哈希函数在种类上均分 设计RandomPool结构 设计一种结构&#xff0c;在该结构中有如下三个功能: insert(key):将某个key加入到该结构&#xff0c;做到不重复加入 delete(key):将原本在结构中的某个key移除 getRando…

MySQL 使用规范 —— 如何建好字段和索引

一、案例背景 二、库表规范 1. 建表相关规范 2. 字段相关规范 3. 索引相关规范 4. 使用相关规范 三、建表语句 三、语句操作 1. 插入操作 2. 查询操作 四、其他配置 1. 监控活动和性能&#xff1a; 2. 连接数查询和配置 本文的宗旨在于通过简单干净实践的方式教会读…

2023百度云智大会:科技与创新的交汇点

​ 这次的百度云智大会&#xff0c;可谓是亮点云集—— 发布了包含42个大模型、41个数据集、10个精选应用范式的全新升级千帆大模型平台2.0&#xff0c;发布首个大模型生态伙伴计划&#xff0c;而且也预告了文心大模型4.0的发布&#xff0c;大模型服务的成绩单也非常秀&#x…

【autodesk】浏览器中渲染rvt模型

使用Forge完成渲染 Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。在Forge平台中&#xff0c;有一个名为"Model Derivative"的服务&#xff0c;它可以将包括RVT&#xff08;Revit&#xff09;在内的多种BIM&#xff08…

98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a; 输入&am…

嵌入式学习笔记(17)代码重定位实战 上篇

3.5.1任务&#xff1a;在iSRAM中将代码从0xd0020010重定位到0xd0024000 注解&#xff1a;本练习对代码本身运行无实际意义&#xff0c;我们做这个重定位纯粹是为了练习重定位技能。但是某些情况重定位就是必须的&#xff0c;譬如在uboot中。 3.5.2思路 &#xff08;1&#xff…

蓝队追踪者工具TrackAttacker,以及免杀马生成工具

蓝队追踪者工具TrackAttacker&#xff0c;以及免杀马生成工具。 做过防守的都知道大HW时的攻击IP量&#xff0c;那么对于这些攻击IP若一个个去溯源则显得效率低下&#xff0c;如果有个工具可以对这些IP做批量初筛是不是更好&#xff1f; 0x2 TrackAttacker获取 https://githu…

如何从ChatGPT中获得最佳聊天对话效果

从了解ChatGPT工作原理开始&#xff0c;然后从互动中学习&#xff0c;这是一位AI研究员的建议。 人们利用ChatGPT来撰写文章、论文、生成文案和计算机代码&#xff0c;或者仅仅作为学习或研究工具。然而&#xff0c;大多数人不了解它的工作原理或它能做什么&#xff0c;所以他…

电商3D资产优化管线的自动化

如果你曾经尝试将从 CAD 程序导出的 3D 模型上传到 WebGL 或 AR 服务&#xff0c;那么可能会遇到最大文件大小、永无休止的进度条和糟糕的帧速率等问题。 为了创作良好的在线交互体验&#xff0c;优化 3D 数据的大小和性能至关重要。 这也有利于你的盈利&#xff0c;因为较小的…

2023高教社杯全国大学生数学建模竞赛选题建议

如下为C君的2023高教社杯全国大学生数学建模竞赛&#xff08;国赛&#xff09;选题建议&#xff0c; 提示&#xff1a;DS C君认为的难度&#xff1a;C<B<A&#xff0c;开放度&#xff1a;B<A<C 。 D、E题推荐选E题&#xff0c;后续会直接更新E论文和思路&#xf…

MaskVO: Self-Supervised Visual Odometry with a Learnable Dynamic Mask 论文阅读

论文信息 题目&#xff1a;MaskVO: Self-Supervised Visual Odometry with a Learnable Dynamic Mask 作者&#xff1a;Weihao Xuan, Ruijie Ren, Siyuan Wu, Changhao Chen 时间&#xff1a;2022 来源&#xff1a; IEEE/SICE International Symposium on System Integration …

正版软件 | CloudDrive 多云盘本地挂载管理工具

前言&#xff1a; CloudDrive 是一个强大的多云盘管理工具&#xff0c;提供一站式的多云盘解决方案&#xff0c;包括云盘本地挂载。旨在无缝集成多个云存储服务&#xff0c;统一整合到一个界面。轻松管理和访问所有云存储服务&#xff0c;无需在不同的应用程序和界面之间切换。…

【Go基础】编译、变量、常量、基本数据类型、字符串

面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 编译 使用 go build 1.在项目目录下执行 2.在其他路径下编译 go build &#xff0c;需要再后面加上项目的路径&#xff08;项目路径从GOPATH/src后开始写起&#xff0c;编译之后的可执行文件就保存再…

matlab和python做zscore结果不一样的问题

解决matlab和python做zscore标准化结果不一样的问题 总结: matlab和python做zscore时使用的求std公式的默认方法有差异&#xff0c;导致了结果差异。 想要结果相同则使用以下代码&#xff1a; td rand(50,15,39)%td是三维矩阵&#xff0c;求zscore结果 #Python代码&#xf…