数据库外键关系分类一对多,一对一,多对多

1.OneToOne

如何判断表关系满足一对1

比如用户表和用户详细信息表

举例:

1.核心思想换位思考:第一先站在user表思考一个用户有可以对应有几个详细信息,当然是一个由此判断user表到userdetail表满足1单向一对1

2.再站在userdetail表,一个userdetail可以属于几个用户,显然只能属于一个,userdetail到user表满足单向一对1,如果任意单向满足一对多,则为一对多关系,

结论:双向一对一均成立,关系为一对一

创建表注意事项:

外键可以在两个表任何一方,一般放在主要频繁查询的表,如用户表

2.OneToMany

举例员工和部门表:

1.核心思想:换位思考:

一个部门可以有多个员工所以部门对员工为一对多,一个员工只能属于一个部门,员工对部门为1对一,所以判断任何一方满足一对多就为一对多,结论:

部门与员工一对多关系

2.创建表注意事项:a.外键foregin创建在多的一方 b.创建表时必须先创建references 的被关联表 c录入数据时也必须先录入被关联的表这里是dep表,为什么呢:

因为employ有dep_id 字段,如果不先创建dep表无法获取到dep_id外键dep的主键(这里是默认id,实际开发可以指定其他字段)字段

问题:如果现在我想修改或者删除dep的部门id ,则会报外键约束报错,如何实现同步删除更新呢?

解决思路1:先删除/修改外键表数据,再删除/修改部门数据,(太繁琐,不适用)

解决思路2:同步更新,同删除,俗称级联删除 CASCADE

create   table emp (id int(64)  primary key auto_increment,
emp_name  varchar(64),
emp_id int(64) ,
dep_id  int,
foregin key(dep_id) refences dep(id)  
on update cascade
on detele cascade 
 )

  

3.ManyToMany

多对多关系:其实就是双向一对多,则满足多对多

案例:图书表和作者表:假设可以这么写映射关系,发现两个表都有个外键字段,上面一对多介绍过单项一对多时都必须先创建外键表的被关联表references ,站在book表,你要先建author表由于外键author_id

,但是跑去创建author表,我靠你又需要先创建book表由于book_id外键,这样你先,你先,谁都别想create 成功

问题思考:多对多实际无非就想直到书和作者关系,所以两个表无法实现的,需要借助第三张表,专门存储两张表的之间的关系,也就是储存他们的外键

解决办法:

 创建表sql:

create table book_author( id int primary key auto_increment,
book_id int ,
author_id int ,
foregin key(book_id) refences book(id)  
on update cascade
on detele cascade ,
foregin key(author_id) refences author(id)  
on update cascade
on detele cascade 
);

  

原文地址:https://www.cnblogs.com/SunshineKimi/p/13800036.html