Mysql-外键关联-外键与表的关系(一对多, 一对一,多对多)

多表的设计

一对多

在多方表中,创建一个新的字段,作为当前表的外键,指向一方表的主键
注意点: 一对多, 外键设置在多方

一张表关联多张表,通过 foreign key (字段名) references 关联的表名(字段)

模拟一对多表

一对多表的结构设计,两张表
主表(一方) 从表(多方)
建表原则,在多方表中添加字段,把该字段作为外键指向一方表的主键

一个部门有许多员工,所以外键设置在多方 ,所以是员工表
部门表
create table department(
id int primary key auto_increment,
name varchar(20) not null
);


员工表
create table emp(
eid int primary key auto_increment,
ename varchar(20),
dno int, # 添加一个字段,把该字段设置为外键关联
foreign key (dno) references department(id)
);

添加数据:
往表中添加时,
主表必须要有数据,从表才能添加数据
并且从表关联的外键值, 主表必须要有对应的
否则添加不上,删除同理

外键默认的约束

创建外键关联时,可以添加下面两行代码,指定约束级联,为空等
表示删除,更新后怎么处理
比如:删除从表的数据,主表同意否?
如果是 casccade 是级联 表示不同意你删除数据

  on update cascade
  on delete  cascade 
create table emp(
eid int primary key auto_increment,
ename varchar(20),
dno int, # 添加一个字段,把该字段设置为外键关联
foreign key (dno) references department(id),
on update cascade
on delete  cascade 
);

一对一

例如: 一个人在一个部门,没来之前不存在,来了之后,就是员工
而这个部门对应的这个人是唯一的,不可能有两个一模一样的人
这就是一对一,一个人对应一个部门
例如: 一张身份证对应一个人,
一定要保证外键的字段是唯一的 unique

create table card(
id int primary key auto_increment,
phone char(18) not null,
name char(20) not null
);

create table people(
id int primary key auto_increment,
name varchar(20) not null,
c_id int unique, # 该字段一定要唯一
foreign key(c_id) references card(id) # 外键字段一定要保证unique

);

多对多

中间要添加数据时,要看两张主表有没有数据

先创建一张中间表,中间表中至少包含2个字段
2个字段作为当前中间表的外键,指向原来多对多表的主键

在这里插入图片描述
多对多:用户与角色, 一个用户拥有多个角色,一个角色可以被多个用户所拥有

建立三张表
首先 建立 用户表 角色表
在建立中间表

用户表:
create table user(
id int primary key auto_increment,
name varchar(20)
);


角色表
create table role(
id int primary key auto_increment,
name varchar(20)
);

建立第三方表来处理多对多的关联
# 创建两个外键关联,分别关联两个不同的表
create table user_role(
id int primary key auto_increment,
user_id int,
role_id int,
foreign key(user_id) references user(id),
foreign key(role_id) references role(id)
);





  • 15
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值