---恢复内容开始---
1.外键(重点)
2.修改表的完整语句(了解知识点)
一.外键
外键一共分为三大类:一对多,多对多,一对一
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.表的扩展性极差(无法忽略的缺点)这个问题就类似我们将所有的代码都写在用一个py文件内
那么我们该怎么解决这个问题:(我们要把表分开,解耦和)
emp
id | emp_name | emp_gender | dep_id |
1 | jason | male | 1 |
2 | egon | female | 2 |
3 | tank | male | 2 |
4 | jerry | male | 2 |
5 | kevin | male | 3 |
dep
id | dep_name | dep_desc |
1 | 外交部 | 形象代言人 |
2 | 教学部 | 教书育人 |
3 | 技术部 | 技术能力有限部门 |
表示解耦和了,那么该如何确定这俩张表是什么关系:
确立表与表之间的关系 一定要换位思考(必须两方都考虑周全之后才能得出结论) 以员工表和部门表为例 先站在员工表看能否有多个员工对应一个部门 翻译过来:一个部门能否有多个员工 可以!!!(暂时只能确定员工单向多对一部门) 再站在部门表看能否有多个部门对应一个员工 翻译过来:一个员工能否属于多个部门 不可以!!! 由此得出的结论就是: 员工表和部门表之间仅仅是单向的多对一,那么他们的关系就是!!一对多!!, 表关系中没有!多对一!这么一说,只有一对多 那么该如何让俩张表有代码上的关联,这就必须使用外键了: 什么是外键:就是让表与表之间有硬性上的关系 该如何使用: foreign key 外键约束 1.在创建表的时候 必须先创建被关联表 2.插入数据的时候 也必须先插入被关联表的数据
代码实现:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 create table dep( 2 id int primary key auto_increment, 3 dep_name varchar(32), 4 dep_desc varchar(128) 5 ); 6 7 8 create table emp( 9 id int primary key auto_increment, 10 emp_name varchar(64), 11 emp_gender enum('male','female','others') default 'male', 12 dep_id int, 13 foreign key(dep_id) references dep(id) 14 on update cascade 级联更新级联删除 15 on delete cascade 16 ); 17 18 19 insert into dep(dep_name,dep_desc) values('外交部','搞外交'), 20 ('教学部','教书育人'), 21 ('技术部','技术能力有限部门') 22 ; 23 24 25 insert into emp(emp_name,dep_id) values('jason',1), 26 ('egon',2), 27 ('tank',2), 28 ('kevin',3);
注意点:
修改表数据: update dep set id=200 where id=1; update emp set dep=300 where =1; 现在还不能修改表里的数据,需要在外键后面加上 2行代码 on update cascade 级联更行 on delete cascade 级联删除 注意:外键虽然能够帮你强制建立表的关系,但是也会给表之间增加数据的相关的约束 1.删除数据的时候,需要先删员工表的数据,再删部门表的数据(因为员工表设置了外键,你要是先删部门了,那么员工表的外键序号是不存在的) delete from emp where id = 4; delete from dep where id = 3; 1。受限于外键约束,导致操作数据变得非常复杂,能否有一张简单的方式,
让我不需要考虑在操作目标表的时候还需要考虑关联表的情况,比如我删除部门
,那么这个部门对应的员工就应该跟着立即清空 2.更新于删除都需要考虑到关联与被关联的关系>>>同步更新与同步删除 这里就需要用到 级联更新级联删除 删除部门后,对应的部门里面的员工表数据对应删除 更新部门后,对应员工表中的标示部门的字段同步更新
2.多对多
分析多对多表的关系:
多对多表的关联关系:
可以比喻为 图书表与作者表(记住一定要换位思考)
先站在图书表来看:
多本书能否有一个作者 可以!!
一本书能否有多个作者 可以!!
再站在作者表来看:
多个作者能否合写一本书 可以!!
一本书能否有多个作者 可以!!
如果双方都是可以,那么就是多对多的关系
不逼逼了,看图吧:
book
id | title | price | desc |
1 | 精品美 | 999 | 小黄书 |
2 | python从入门到放弃 | 1000 | 教你如何从小白变成屌丝 |
3 | 聊斋志异 | 6969 | 带你看鬼 |
author
id | name | age |
1 | jason | 18 |
2 | egon | 19 |
那么代码我们该如何实现:
先来想如何创建表?图书表需要有一个外键关联作者,作者也需要有一个外键字段关联图书。问题来了,先创建谁都不合适!如何解决?因为创建外键的时候,需要一个被关联的id
解决:
记住,多对多关系的建立,必须手动创建第三张表,用来专门记录俩种表之间的关系。
先建俩种普通的表,不需要设置外键
注意:
重点在第三张表上,设置2个id字段,每个字段下面设置外键
代码实现:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 create table book( 2 id int primary key auto_increment, 3 title varchar(32), 4 price int 5 ); 6 create table author( 7 id int primary key auto_increment, 8 name varchar(32), 9 age int 10 ); 11 create table book2author( 12 id int primary key auto_increment, 13 book_id int, 14 foreign key(book_id) references book(id) 15 on update cascade 16 on delete cascade, 17 author_id int, 18 foreign key(author_id) references author(id) 19 on update cascade 20 on delete cascade 21 ); 22 23 insert into book(title,price) values('精品美',199),('聊斋',299),('jason教你删别人的库,让别人跑去吧',1); 24 25 26 insert into author(name,age) values('jason',18),('tank',38); 27 28 29 insert into book2author(book_id,author_id) values(4,3); # 报错 30 insert into book2author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2); 31
3.一对一表的关系
1.一对一的场景,当你的表的数据非常庞大的时候,你可以考虑拆分表 2.联想老男孩的客户和学生 user id name age
userdetail(用户详细信息) hobby addr ICDard
当你没有交学费之前 ,你是老男孩的客户 当你交了学费之后,你就变成老男孩的学生 问题来了: 难道只要是咨询的客户都会变成学生么???怎么可能
一对一就是一一对应,不能一对多,也不能多对多
注意!!
我们通常将关系字段,称之为外键字段
一对多的外键字段:建在多的一方
多对多的外键字段:建在第三张表里
一对一的外键字段:建在任意一方都可以,但是推荐你建在查询频率较高的一方
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 create table authordetail1( 2 id int primary key auto_increment, 3 phone int, 4 addr char(255) 5 6 ); 7 8 9 create table author1( 10 id int primary key auto_increment, 11 name char(4), 12 age int, 13 authordetail_id int unique, 14 foreign key(authordetail_id) references authordetail1(id) 15 on update cascade 16 on delete cascade 17 ); 18
总结:判断表关系的最简单的方法
图书与出版社
一本书可不可以有多个出版社 不可以!!!
一个出版社可不可以出版多本书 可以!!!
一对多的关系
图书与作者表
一本书可不可以有多个作者 可以!!!
一个作者可不可以写多本书 可以!!!
多对多的关系
作者与作者详情
一个作者可不可以有多个详情 不可以!!!
一个作者详情可不可以有多个作者 不可以!!!
要么两者是一对一
要么两者之间没任何关系
了解知识点:
1.修改表的完整语句 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 旧字段名 新字段名 新数据类型 [完整性约束条件…]; # 查询语句执行的结果也是一张表,可以看成虚拟表 # 复制表结构+记录 (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;