数据库外键约束关键字外键
# 外键前戏
以创建⼀张员⼯表为例
表头内容包含:
id name age dep_name dep_desc
"""
缺陷:foreign key references用法
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
);
"""
⼀对⼀表关系
以作者表与作者详情表为例
先站在作者表的基础之上
问:⼀个作者信息能否对应多个作者详情信息
答:不可以
再站在作者详情表的基础之上
问:⼀个作者详情信息能否对应多个作者信息
答:不可以
结论:两个都不可以
那么表关系可能是"⼀对⼀"或者"没有关系"
# 外键字段建在任何⼀⽅都可以但是推荐建在查询频率较⾼的表中
"""
create table author(
id int primmary key auto_increment,
name varchar(32),
age int,
author_id int unique,
foreign key(author_id) references author_detail(id)
on update cascade
on delete cascade
);
create table author_detail(
id int primary key auto_increment,
phone varchar(32),
address varchar(32)
);
"""
外键约束
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论