day36-表关系(外键)

 

 

1 表关系之外键

1.1 前戏之一对多关系

# 定义一张部门员工表
id    name    gender    dep_name    dep_desc
1    jason    male         教学部      教书育人
2    egon     male         外交部      漂泊游荡
3    tank     male         教学部      教书育人
4    kevin    male         教学部      教书育人
5    owen    female      技术部     技术能力有限部门     


把所有数据都存放于一张表的弊端
1.组织结构不清晰
2.浪费硬盘空间
3.扩展性极差(无法忽略的缺点)

1.2 解决方案

# 上述的弊端产生原因类似于把代码全部写在一个py文件中,我们应该怎么做?>>>解耦合!将上述一张表拆成员工和部门两张表!
# 类似的表关系学生与班级,也是如此,一张学生表和一张班级表
# 分析表数据之间的关系:多个用户对应一个部门,一个部门对应多个用户。禁止一个用户对应多个部门这种情况是另外一张表关系

 

1.3 如何查找表与表之间的关系

老师与课程表
1.站在老师表的角度:一名老师能否教授多门课程(限制死,不能,一名老师只能教python,不能同时教python和linux)
2.站在课程表的角度:一门课程能否可以被多个老师教,完全可以!
那就是课程表多对一老师表,如何表示这种关系?在课程表中创建一个字段(tea_id)指向老师表的id字段学生与班级表
1.站在学生表的角度:???
2.站在班级表的角度:???
那就是学生表多对一班级表,如何表示这种关系?在学生表中创建一个字段(class_id)指向班级表的id字段

 

# 再回过头来看员工与部门表,我员工表里面的dep_id我可以随意更改,但是应该有一个强制限制,限制dep_id字段必须只是部门表已有的id字段才合理

 

2 一对多(Foreign Key)

foreign key会带来什么样的效果?
2.1 在创建表时,先建被关联的表dep,才能建关联表emp

create table dep(
id int primary key auto_increment,
dep_name char(10),
dep_comment char(60)
);create table emp(
id int primary key auto_increment,
name char(16),
gender enum('male','female') not null default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
);

 

2.2 在插入记录时,必须先插被关联的表dep,才能插关联表emp

insert into dep(dep_name,dep_comment) values
('sb教学部','sb辅导学生学习,教授python课程'),
('外交部','老男孩上海校区驻张江形象大使'),
('nb技术部','nb技术能力有限部门');insert into emp(name,gender,dep_id) values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);

 

2.2.2 删除

# 当我想修改emp里的dep_id或dep里面的id时返现都无法成功
# 当我想删除dep表的教学部的时候,也无法删除
# 方式1:先删除教学部对应的所有的员工,再删除教学部
# 方式2:受限于外键约束,导致操作数据变得非常复杂,能否有一张简单的方式,让我不需要考虑在操作目标表的时候还需要考虑关联表的情况,比如我删除部门,那么这个部门对应的员工就应该跟着立即清空# 先把之前创建的表删除,先删员工表,再删部门表,最后按章下面的方式重新创建表关系

 

2.3 更新于删除都需要考虑到关联与被关联的关系>>>同步更新与同步删除

create table dep(
id int primary key auto_increment,
dep_name char(10),
dep_comment char(60)
);create table emp(
id int primary key auto_increment,
name char(16),
gender enum('male','female') not null default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
);
insert into dep(dep_name,dep_comment) values
('sb教学部','sb辅导学生学习,教授python课程'),
('外交部','老男孩上海校区驻张江形象大使'),
('nb技术部','nb技术能力有限部门');insert into emp(name,gender,dep_id) values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);

 

# 删除部门后,对应的部门里面的员工表数据对应删除
# 更新部门后,对应员工表中的标示部门的字段同步更新

 

3 多对多


# 图书表与作者表之间的关系

仍然站在两张表的角度:
1.站在图书表:一本书可不可以有多个作者,可以!那就是书多对一作者
2.站在作者表:一个作者可不可以写多本书,可以!那就是作者多对一书
双方都能一条数据对应对方多条记录,这种关系就是多对多!

# 先来想如何创建表?图书表需要有一个外键关联作者,作者也需要有一个外键字段关联图书。问题来了,先创建谁都不合适!如何解决?
# 建立第三张表,该表中有一个字段fk左表的id,还有一个字段是fk右表的id

create table author(
id int primary key auto_increment,
name char(16)
);create table book(
id int primary key auto_increment,
bname char(16),
price int
);insert into author(name) values
('egon'),
('alex'),
('wxx')
;
insert into book(bname,price) values
('python从入门到入土',200),
('葵花宝典切割到精通',800),
('九阴真经',500),
('九阳神功',100)
;create table author2book(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);insert into author2book(author_id,book_id) values
(1,3),
(1,4),
(2,2),
(2,4),
(3,1),
(3,2),
(3,3),
(3,4);

 

 

4 一对一

客户表和学生表(老男孩的客户与学生之间,报名之前都是客户,只有报了名的才能是学生)

```python
# 左表的一条记录唯一对应右表的一条记录,反之也一样

create table customer(
id int primary key auto_increment,
name char(20) not null,
qq char(10) not null,
phone char(16) not null
);create table student(
id int primary key auto_increment,
class_name char(20) not null,
customer_id int unique, #该字段一定要是唯一的
foreign key(customer_id) references customer(id) #外键的字段一定要保证unique
on delete cascade
on update cascade
);

 

# 三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系
```

## 修改表

```mysql
# mysql对大小写不敏感!!!
语法:
1. 修改表名
ALTER TABLE 表名
RENAME 新表名;
2. 增加字段
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
3. 删除字段
ALTER TABLE 表名
DROP 字段名;
4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
ALTER TABLE 表名
MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
```

## 复制表

```mysql
# 查询语句执行的结果也是一张表,可以看成虚拟表

# 复制表结构+记录 (key不会复制: 主键、外键和索引)
create table new_service select * from service;

# 只复制表结构
select * from service where 1=2; //条件为假,查不到任何记录

create table new1_service select * from service where 1=2;

create table t4 like employees;
```

## 作业布置

练习:账号信息表,用户组,主机表,主机组

```python
#用户表
create table user(
id int not null unique auto_increment,
username varchar(20) not null,
password varchar(50) not null,
primary key(username,password)
);

#用户组表
create table usergroup(
id int primary key auto_increment,
groupname varchar(20) not null unique
);

#主机表
create table host(
id int primary key auto_increment,
ip char(15) not null unique default '127.0.0.1'
);

#业务线表
create table business(
id int primary key auto_increment,
business varchar(20) not null unique
);

#建关系:user与usergroup

create table user2usergroup(
id int not null unique auto_increment,
user_id int not null,
group_id int not null,
primary key(user_id,group_id),
foreign key(user_id) references user(id),
foreign key(group_id) references usergroup(id)
);

#建关系:host与business
create table host2business(
id int not null unique auto_increment,
host_id int not null,
business_id int not null,
primary key(host_id,business_id),
foreign key(host_id) references host(id),
foreign key(business_id) references business(id)
);

#建关系:user与host
create table user2host(
id int not null unique auto_increment,
user_id int not null,
host_id int not null,
primary key(user_id,host_id),
foreign key(user_id) references user(id),
foreign key(host_id) references host(id)
);
```

练习:

```python
# 班级表
cid caption
# 学生表
sid sname gender class_id
# 老师表
tid tname
# 课程表
cid cname teacher_id
# 成绩表
sid student_id course_id number
```

 

转载于:https://www.cnblogs.com/Ryan-Yuan/p/11382900.html

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

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

相关文章

图灵奖获得者Yann LeCun:未来几十年AI研究的最大挑战是「预测世界模型」

来源:机器学习研究组订阅LeCun 认为,构造自主 AI 需要预测世界模型,而世界模型必须能够执行多模态预测,对应的解决方案是一种叫做分层 JEPA(联合嵌入预测架构)的架构。该架构可以通过堆叠的方式进行更抽象、…

总结出来的一些ASP.NET程序性能优化的注意事项[不断补充]

只是提了一个基本概念,具体要点要是需要查找资料。本文的各个要点,都是从网上大量文章中总结出来。参考资料:http://www.cnblogs.com/lxinxuan/archive/2006/11/06/551980.htmlasp.net程序性能优化总结 ——备忘具体技术 细节请查询 1. …

可重构人工智能设备展现出智能化前景

PURDUE UNIVERSITY来源:IEEE电气电子工程师一项新的研究发现,一种适应性强的新设备可以转换成人工智能硬件所需的所有关键电子元件,在机器人和自治系统中有潜在的应用。以大脑为灵感或“神经形态”的计算机硬件旨在模仿人脑从经验中自适应学习…

gin+vue的前后端分离开源项目

该项目是ginvue的前后端分离项目,使用gorm访问MySQL,其中vue前端是使用vue-element-admin框架简单实现的; go后台使用jwt,对API接口进行权限控制。此外,Web页面在token过期后的半个小时内,用户再次操作会自…

day37-数据库分组查询

1. 单表查询 2. 多表查询 ## 单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum(male,female) not null default male, #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, …

指挥控制智能化现状与发展

来源:人机与认知实验室0 引言人工智能(AI)技术现已进入一个新的高速增长期,是公认最有可能改变未来世界的颠覆性技术。从“深蓝”战胜卡斯帕罗夫,到机器学习技术在语音识别、图像识别和自然语言处理等诸多…

IEEE 2022年网络、计算机和通信国际学术研讨会(ISNCC2022)

2022年网络、计算机和通信国际学术研讨会(International Symposium on Networks, Computers andCommunications,2022)主办:电气与电子工程师学会(IEEE)、IEEE 通信学会(IEEE Communications Society&#x…

@RequestParam和@RequestBody的区别

RequestBody是用来接收 application/json需要解析json字符串,然后通过json获取参数,这里用到是fastjson public CommonReturnType login(RequestBody String jsonStr) {JSONObject requestJson JSON.parseObject(jsonStr);String telphone(String)requestJson.get…

【重要征稿】IEEE 2022年网络、计算机和通信国际学术研讨会(ISNCC2022)

2022年网络、计算机和通信国际学术研讨会(International Symposium on Networks, Computers andCommunications,2022)主办:电气与电子工程师学会(IEEE)、IEEE 通信学会(IEEE Communications Society&#x…

C++ 类设计核查表

参考:https://www.jianshu.com/p/01601515ca31 《大规模C程序设计》 函数接口: 1.运算符或非运算符函数? 2.自由或成员运算符? 3.虚函数或非虚函数? 4.纯虚成员函数或非纯虚成员函数? 5.静态或非静态成员函…

CICC《城市大脑建设规范》标准建设启动会在京召开

来源:中国指挥与控制学会 2022年2月27日下午,中国指挥与控制学会(以下简称:CICC)在京召开了《城市大脑建设规范》团体标准启动会。启动会邀请到了中国电信、中国电科、中国电子、联想、科大讯飞、世纪互联、北京市标准…

day38-数据库应用软件

# mysql select distinct 字段1,字段2,。。。 from 表名 where 分组之前的过滤条件 group by 分组条件 having 分组之后过滤条件 order by 排序字段1 asc,排序字段2 desc limit 5,5as语法中给某个查询结果起别名的时候需要把查询语句中…

世界被一种神秘的数学力量彻底改变了

来源:《微积分的力量》编辑:nhyilin01科学或许是唯一的神上世纪60年代,小说家赫尔曼沃克(Herman Wouk)正在为他计划中的巨著《战争风云》做调研,他去加州理工学院采访了参与过原子弹研发的物理学家&#xf…

程序异常退出后,托盘残留图标清理方法(C#)

程序猿对于宕机再熟悉不过了,如果一个程序异常退出,那我们只能在Windows日志中找到它的踪迹;如果它是一个托盘程序,异常退出后,它会停留在托盘中久久不能离去,直到我们的鼠标从它身上划过;如果一…

汪劲:生命系统中的非平衡物理学

来源:集智俱乐部作者:汪劲编译:袁郭玲编辑:邓一雪导语非平衡物理学将在生物应用中发挥重要作用,如酶动力学、新陈代谢、基因调控,细胞的结构、功能和动力学,生理学、癌症、分化和发育&#xff0…

虚拟现实和元宇宙的最大短板在哪里?

出品:科技智谷编辑:王晓东虚拟现实和元宇宙面临的最大问题不是技术问题而是功能问题。在所有关于Metaverse以及虚拟现实或VR将给我们的生活带来什么的讨论中,有一个很大的功能问题被忽略了。正如几大巨头宣传的那样,Metaverse是一…

cmake 配置

罗列一下cmake常用的命令。CMake支持大写、小写、混合大小写的命令。 1. 添加头文件目录INCLUDE_DIRECTORIES 语法:include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])它相当于g选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INC…

解密通往元宇宙的三大入口,VR先上AR紧跟,但脑机接口才是未来

来源: 智东西编辑:智东西内参VR、AR和脑机接口,谁是人类通往元宇宙的合适入口?VR/AR/脑机接口是集合了微显示、传感器、芯片和算法等多项技术在内的下一代人机交互平台。回顾整个人机交互发展历程,我们看到人机交互的指令输入形式…

配置opencv cmake

第一种使用 find_package的方法示例代码如下:# 声明要求的 cmake 最低版本cmake_minimum_required( VERSION 2.8 ) # 声明一个 cmake 工程project( pro ) # 设置编译模式set( CMAKE_BUILD_TYPE "Debug" ) #添加OPENCV库#指定OpenCV版本,代码如下#find_pac…

python enumerate用法总结(转)

原文链接:https://blog.csdn.net/churximi/article/details/51648388 enumerate()说明 enumerate()是python的内置函数enumerate在字典上是枚举、列举的意思对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串)&…