mysql中表与表的关系代码_mysql 中表与表之间的关系

如何找出两张表的对应关系

分析步骤:

1.先找出左表的角度去找

​ 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段 (通常是id)

2.再站在右表的角度去找

​ 是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)

3.总结

多对一

如果只有步骤1成立,则是左表多对一右表 如果只有步骤2成立,则是右表多对一左表

多对多

如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系

一对一

如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可

建立表之间的关系

一对多 多对一

一对多或称为多对一

三张表:出版社,作者信息,书

一对多(或多对一):一个出版社可以出版多本书

关联方式:foreign key

代码如下

create table press(

id int primary key auto_increment,

name varchar(20) 创建了一个 press 表

);

create table book(

id int primary key auto_increment,

name varchar(20),

press_id int not null,

foreign key(press_id) references press(id)

on delete cascade

on update cascade

); 创建了和上一个表有关系的 book 表

insert into press(name) values 在 press 表中加入元素

('北京工业地雷出版社'),

('人民音乐不好听出版社'),

('知识产权没有用出版社')

;

insert into book(name,press_id) values

('九阳神功',1),

('九阴真经',2),

('九阴白骨爪',2),

('独孤九剑',3),

('降龙十巴掌',2),

('葵花宝典',3)

;

**一对多举个例子 : 班级和学生 **

一个班级可以对应多个学生,但是一个学生只能对应一个班级

主机和机房

一个机房可以有多个主机,但是一个主机只能有一个机房

多对多

多对多

三张表:出版社,作者信息,书

多对多:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多

关联方式:foreign key+一张新的表

多对多的关系中就必须产生第三张表 放在前两张表中的话,太笼统了,所以需要第三张表来清晰一下

create table author(

id int primary key auto_increment,

name varchar(20)

);

#这张表就存放作者表与书表的关系,即查询二者的关系查这表就可以了

create table author2book(

id int not null unique auto_increment,

author_id int not null,

book_id int not null,

constraint fk_author foreign key(author_id) references author(id)

on delete cascade

on update cascade,

constraint fk_book foreign key(book_id) references book(id)

on delete cascade

on update cascade,

primary key(author_id,book_id)

);

#插入四个作者,id依次排开

insert into author(name) values('egon'),('alex'),('yuanhao'),('wpq');

#每个作者与自己的代表作如下

egon:

九阳神功

九阴真经

九阴白骨爪

独孤九剑

降龙十巴掌

葵花宝典

alex:

九阳神功

葵花宝典

yuanhao:

独孤九剑

降龙十巴掌

葵花宝典

wpq:

九阳神功

insert into author2book(author_id,book_id) values

(1,1),

(1,2),

(1,3),

(1,4),

(1,5),

(1,6),

(2,1),

(2,6),

(3,4),

(3,5),

(3,6),

(4,1)

;

**多对多举例 : **

服务和机器:

一个服务可能被部署到多台机器上,一台机器上也可以部署多个任务

学生和课程 :

一个学生可以选择多门课程,一个课程也可以被多个学生选择

一对一

两张表:学生表和客户表

一对一 : 一个学生一个客户

关联方式:foreign key+unique

create table customer(

-> id int primary key auto_increment,

-> name varchar(20) not null,

-> qq varchar(10) not null,

-> phone char(16) not null

-> );

create table student(

-> id int primary key auto_increment,

-> class_name varchar(20) not null,

-> customer_id int unique, #该字段一定要是唯一的

-> foreign key(customer_id) references customer(id) #外键的字段一定要保证unique

-> on delete cascade

-> on update cascade

-> );

#增加客户

mysql> insert into customer(name,qq,phone) values

-> ('韩蕾','31811231',13811341220),

-> ('杨澜','123123123',15213146809),

-> ('翁惠天','283818181',1867141331),

-> ('杨宗河','283818181',1851143312),

-> ('袁承明','888818181',1861243314),

-> ('袁清','112312312',18811431230)

mysql> #增加学生

mysql> insert into student(class_name,customer_id) values

-> ('脱产1班',3),

-> ('周末1期',4),

-> ('周末1期',5)

-> ;

sql示例

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值