外键
# 外键前戏
以创建一张员工表为例
表头内容包含:
id name age dep_name dep_desc
"""
缺陷:
1.表的重点不清晰
到底是员工表还是部门表 可以忽略
2.表中相关字段一直在重复存储
浪费存储空间 可以忽略
3.表的扩展性极差,牵一发而动全身
不能忽略
解决方式:
将上述一张表拆分成两张表
emp与dep
上述三个缺陷全部解决
但是:
带来了一个小问题 表与表之间的数据没有对应关系了
"""
# 解决:外键
外键字段>>>:部门编号
"""
外键:
其实就是用来标识表与表之间的数据关系
简单的理解为该字段可以让你去到其他表中查找数据
"""
表与表之间建关系
# 表关系总共就四种
一对多
多对多
一对一
没有关系
一对多
# 判断表关系的方式:换位思考
# 一对多
以员工和部门表为例
先站在员工表的基础之上
问:一个员工信息能否对应多个部门信息
答:不可以
再站在部门表的基础之上
问:一个部门信息能否对应多个员工信息
答:可以
结论:一个可以一个不可以 那么表关系就是"一对多"
员工表是多 部门表是一
"""
针对一对多的表关系 外键字段建在多的一方
表关系没有'多对一'一说 都是'一对多'
"""
"""
使用SQL语句建立真正意义上的表关系 可以先创建不含外键字段的基本表
之后再添加外键字段
create table dep(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(254)
);
create table emp(
id int primary key auto_increment,
name varchar(32),
age int,
dep_id int,
foreign key(dep_id) references dep(id) # emp表中的dep_id必须在dep表中包含
);
insert into dep(dep_name,dep_desc) values('教学部','教书育人'),('安保部','保卫家园'),('人事部','招兵买马'),('财务部','军饷保证');
insert into emp(name,age,dep_id) values('jason',18,1),('tony',28,2),('mary',38,3),('jack',48,4);
"""
多对多关系
# 多对多关系
以书籍表与作者表为例
先站在书籍表的基础之上
问:一个书籍信息能否对应多个作者信息
答:可以
再站在作者表的基础之上
问:一个作者信息能否对应多个书籍信息
答:可以
结论:两个都可以 那么表关系就是"多对多"
# 多对多表关系 需要单独开设第三张表存储(并且第三张表可以不绑定)
"""
create table book(
id int primary key auto_increment,
title varchar(32),
price float(6,2)
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int
);
create table book2author(
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
);
"""
一对一表关系
# 一对一表关系
以作者表与作者详情表为例
先站在作者表的基础之上
问:一个作者信息能否对应多个作者详情信息
答:不可以
再站在作者详情表的基础之上
问:一个作者详情信息能否对应多个作者信息
答:不可以
结论:两个都不可以
那么表关系可能是"