数据库外键约束关键字

外键

# 外键前戏
以创建一张员工表为例
表头内容包含:
	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
);
"""

一对一表关系

	# 一对一表关系
	以作者表与作者详情表为例
		先站在作者表的基础之上
			问:一个作者信息能否对应多个作者详情信息
				答:不可以
		再站在作者详情表的基础之上
			问:一个作者详情信息能否对应多个作者信息
				答:不可以
		结论:两个都不可以 
            
	那么表关系可能是"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值