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

news2024/11/17 21:20:52

在这里插入图片描述

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

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

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

  • 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.coloradmin.cn/o/984747.html

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

相关文章

扩散模型 DDPM 核心代码梳理

参考内容: 大白话AI | 图像生成模型DDPM | 扩散模型 | 生成模型 | 概率扩散去噪生成模型 AIGC 基础,从VAE到DDPM 原理、代码详解 全网最简单的扩散模型DDPM教程 The Annotated Diffusion Model LaTeX公式编辑器 备注: 具体公式的推导请查看…

BC类电池取代TOPCon?隆基绿能看得很“远”

隆基绿能在业绩会上喊话,BC类电池在未来会逐步取代TOPCON电池,成为晶硅电池的绝对主流,并指出N型TOPCon电池只是短期过渡技术路线。 “All in ”BC类电池的隆基绿能,重新定义技术路线的野望藏不住。 目前来看,相比TO…

数据接口工程对接BI可视化大屏(一)

文章目录 第1章 案例概述1.1 案例目标1.2 BI最终效果1.2.1 PC端显示效果1.2.2 移动端显示效果 后记 第1章 案例概述 1.1 案例目标 此项目以常见的手机零售BI场景为例,介绍如何编写数据接口工程对接BI可视化大屏。 如何从当前常见的主流大数据场景中为后台程序推送…

入行测试一年半的心得体会

成为xx一员测试已经有1年半了,一直没有真正坐下来花些时间将自己的思路理清一下。刚好近期公司落地了OKR,给自己制定了OKR之后思路终于开始清晰起来,朦朦胧胧地开始看清了远方的路,麻着胆子分析一下自己,毕竟摸黑走路的…

2023年9月CSPM-3国标项目管理中级认证报名,找弘博创新

CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要…

【效率提升】手把手教你如何使用免费的 Amazon Code Whisperer 提升开发效率堪比 GitHub Copilot 平替

说明 GitHub copilot 虽然很强,但是一个月10美金的费用拿来吃个小火锅他不香吗?而身为云计算博主将向你推荐一款可以平替 GitHub copilot 并且免费的支持多种编程语言的 AI 编程助手 Amazon Code Whisperer。 亚马逊云科技开发者社区为开发者们提供全球…

基于文本提示的图像目标检测与分割实践

近年来,计算机视觉取得了显着的进步,特别是在图像分割和目标检测任务方面。 最近值得注意的突破之一是分段任意模型(SAM),这是一种多功能深度学习模型,旨在有效地从图像和输入提示中预测对象掩模。 通过利用…

Web安全——Web安全漏洞与利用上篇(仅供学习)

SQL注入 一、SQL 注入漏洞1、与 mysql 注入的相关知识2、SQL 注入原理3、判断是否存在注入回显是指页面有数据信息返回id 1 and 114、三种 sql 注释符5、注入流程6、SQL 注入分类7、接受请求类型区分8、注入数据类型的区分9、SQL 注入常规利用思路:10、手工注入常规…

ansible的安装和简单的块使用

目录 一、概述 二、安装 1、选择源 2、安装ansible 3、模块查看 三、实验 1、拓扑​编辑 2、设置组、ping模块 3、hostname模块 4、file模块 ​编辑 5、stat模块 6、copy模块(本地拷贝到远程) 7、fetch模块与copy模块类似,但作用…

YOLOv5改进算法之添加CA注意力机制模块

目录 1.CA注意力机制 2.YOLOv5添加注意力机制 送书活动 1.CA注意力机制 CA(Coordinate Attention)注意力机制是一种用于加强深度学习模型对输入数据的空间结构理解的注意力机制。CA 注意力机制的核心思想是引入坐标信息,以便模型可以更好地…

火热的低代码,是时候系统的来学一学了!

一、前言 低代码诞生至今,大家各抒己见,也不乏有针锋相对的意思。古时的治国之术有百家争鸣,如今的低代码也有“诸子论道”,这本质上是一件有助于推动低代码发展的事情。 业内的朋友们一定知道,关于低代码的热点不止发…

数字内容风控行业首本白皮书正式发布,打造长效安全的数字内容生态

数字内容包含文本、图片、视频等多种形式,起源于计算机问世,并随着互联网、智能手机快速发展,如今,数字内容已经成为个人及企业建立形象、传播价值的必要途径。 2022年起,随着ChatGPT的火爆出圈,AI大模型强…

Kotlin+MVVM 构建todo App 应用

作者:易科 项目介绍 使用KotlinMVVM实现的todo app,功能界面参考微软的Todo软件(只实现了核心功能,部分功能未实现)。 功能模块介绍 项目模块:添加/删除项目,项目负责管理todo任务任务模块&a…

执行上下文-通俗易懂版

(1) js引擎执行代码时候/前,在堆内存创建一个全局对象,该对象 所有的作用域(scope)都可以访问,里面会包含Date、Array、String、Number、setTimeout、setInterval等等,其中还有一个window属性指向自己 (2…

C++数组类的自实现,使其可以保存学生成绩,并进行降序排列

类的封装 #ifndef ARRAY_H #define ARRAY_Hclass DoubArray { private:int m_length;double* m_pointer;public:DoubArray(int len);DoubArray(const DoubArray& obj);int length();bool get(int index, double& value);bool set(int index, double value);void sort(…

尚硅谷大数据项目《在线教育之离线数仓》笔记007

视频地址:尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 第12章 报表数据导出 P112 01、创建数据表 02、修改datax的jar包 03、ads_traffic_stats_by_source.json文件 P113 P114 P115 P116 P117 P118 P119 P120 P121 P122【122_在…

Hadoop:HDFS--分布式文件存储系统

目录 HDFS的基础架构 VMware虚拟机部署HDFS集群 HDFS集群启停命令 HDFS Shell操作 hadoop 命令体系: 创建文件夹 -mkdir 查看目录内容 -ls 上传文件到hdfs -put 查看HDFS文件内容 -cat 下载HDFS文件 -get 复制HDFS文件 -cp 追加数据到HDFS文件中 -appendTo…

第 3 章 栈和队列(汉诺塔问题递归解法)

1. 背景说明 假设有 3 个分别命名为 X、Y 和 Z 的塔座,在塔座 X 上插有 n 个直径大小各不相同、依小到大编号为 1, 2,…,n 的圆盘。 现要求将 X 轴上的 n 个圆盘移至塔座 Z 上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则&…

伦敦金的走势高低的规律

伦敦金市场是一个流动性很强的市场,其价格走势会在诸多因素的影响下,出现反复的上下波动,如果投资者能够在这些高低走势中找到一定的规律,在相对有利的时机入场和离场,就能够通过不断的交易,累积大量的财富…

浏览器渲染原理及流程

浏览器主要组成与浏览器线程 浏览器组件 浏览器大体上由以下几个组件组成,各个浏览器可能有一点不同。 界面控件 – 包括地址栏,前进后退,书签菜单等窗口上除了网页显示区域以外的部分浏览器引擎 – 查询与操作渲染引擎的接口渲染引擎 – …