Mysql外键的变种 三种关系
一、介绍
因为有foreign key的约束,使得两张表形成了三种了关系:
- 多对一
- 多对多
- 一对一
二、重点理解如果找出两张表之间的关系
- 分析步骤:
- #1、先站在左表的角度去找
- 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)
- #2、再站在右表的角度去找
- 是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)
- #3、总结:
- #多对一:
- 如果只有步骤1成立,则是左表多对一右表
- 如果只有步骤2成立,则是右表多对一左表
- #多对多
- 如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系
- #一对一:
- 如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可
三、表的三种关系
(1)书和出版社
一对多(或多对一):一个出版社可以出版多本书。看图说话。
关联方式:foreign key
- create table press(
- id int primary key auto_increment,
- name varchar(20)
- );
- create table book(
- id int primary key auto_increment,
- name varchar(20),
- press_id int not null,
- constraint fk_book_press foreign key(press_id) references press(id)
- on delete cascade
- on update cascade
- );
- # 先往被关联表中插入记录
- insert into press(name) values
- ('北京工业地雷出版社'),
- ('人民音乐不好听出版社'),
- ('知识产权没有用出版社')
- ;
- # 再往关联表中插入记录
- insert into book(name,press_id) values
- ('九阳神功',1),
- ('九阴真经',2),
- ('九阴白骨爪',2),
- ('独孤九剑',3),
- ('降龙十巴掌',2),
- ('葵花宝典',3)
- ;
- 查询结果:
- mysql> select * from book;
- +----+-----------------+----------+
- | id | name | press_id |
- +----+-----------------+----------+
- | 1 | 九阳神功 | 1 |
- | 2 | 九阴真经 | 2 |
- | 3 | 九阴白骨爪 | 2 |
- | 4 | 独孤九剑 | 3 |
- | 5 | 降龙十巴掌 | 2 |
- | 6 | 葵花宝典 | 3 |
- +----+-----------------+----------+
- 6 rows in set (0.00 sec)
- mysql> select * from press;
- +----+--------------------------------+
- | id | name |
- +----+--------------------------------+
- | 1 | 北京工业地雷出版社 |
- | 2 | 人民音乐不好听出版社 |
- | 3 | 知识产权没有用出版社 |
- +----+--------------------------------+
- 3 rows in set (0.00 sec)
书和出版社(多对一)
(2)作者和书籍的关系
多对多:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多。
看图说话。
关联方式:foreign key+一张新的表
- # 创建被关联表author表,之前的book表在讲多对一的关系已创建
- create table author(
- id int primary key auto_increment,
- name varchar(20)
- );
- #这张表就存放了author表和book表的关系,即查询二者的关系查这表就可以了
- 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'),('wusir'),('yuanhao');
- # 每个作者的代表作
- egon: 九阳神功、九阴真经、九阴白骨爪、独孤九剑、降龙十巴掌、葵花宝典
- alex: 九阳神功、葵花宝典
- wusir:独孤九剑、降龙十巴掌、葵花宝典
- yuanhao:九阳神功
- # 在author2book表中插入相应的数据
- 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)
- ;
- # 现在就可以查author2book对应的作者和书的关系了
- mysql> select * from author2book;
- +----+-----------+---------+
- | id | author_id | book_id |
- +----+-----------+---------+
- | 1 | 1 | 1 |
- | 2 | 1 | 2 |
- | 3 | 1 | 3 |
- | 4 | 1 | 4 |
- | 5 | 1 | 5 |
- | 6 | 1 | 6 |
- | 7 | 2 | 1 |
- | 8 | 2 | 6 |
- | 9 | 3 | 4 |
- | 10 | 3 | 5 |
- | 11 | 3 | 6 |
- | 12 | 4 | 1 |
- +----+-----------+---------+
- 12 rows in set (0.00 sec)
作者与书籍关系(多对多)
(3)用户和博客
一对一:一个用户只能注册一个博客,即一对一的关系。看图说话
关联方式:foreign key+unique
- #例如: 一个用户只能注册一个博客
- #两张表: 用户表 (user)和 博客表(blog)
- # 创建用户表
- create table user(
- id int primary key auto_increment,
- name varchar(20)
- );
- # 创建博客表
- create table blog(
- id int primary key auto_increment,
- url varchar(100),
- user_id int unique,
- constraint fk_user foreign key(user_id) references user(id)
- on delete cascade
- on update cascade
- );
- #插入用户表中的记录
- insert into user(name) values
- ('alex'),
- ('wusir'),
- ('egon'),
- ('xiaoma')
- ;
- # 插入博客表的记录
- insert into blog(url,user_id) values
- ('http://www.cnblog/alex',1),
- ('http://www.cnblog/wusir',2),
- ('http://www.cnblog/egon',3),
- ('http://www.cnblog/xiaoma',4)
- ;
- # 查询wusir的博客地址
- select url from blog where user_id=2;
用户和博客(一对一)
Mysql外键的变种 三种关系的更多相关文章
- Mysql -- 外键的变种 三种关系
一.介绍 因为有foreign key的约束, 使得两张表形成了三种关系 多对一 多对多 一对一 二.如果找出两张表之间的关系 #.先站在左表的角度去找 是否左表的多条记录可以对应右 ...
- python 全栈开发,Day62(外键的变种(三种关系),数据的增删改,单表查询,多表查询)
一.外键的变种(三种关系) 本节重点: 如何找出两张表之间的关系 表的三种关系 一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出 ...
- day03 mysql外键 表的三种关系 单表查询 navicat
day03 mysql navicat 一.完整性约束之 外键 foreign key 一个表(关联表: 是从表)设置了外键字段的值, 对应的是另一个表的一条记录(被关联表: 是主 ...
- mysql更新(五) 完整性约束 外键的变种 三种关系 数据的增删改
11-数据的增删改 本节重点: 插入数据 INSERT 更新数据 UPDATE 删除数据 DELETE 再来回顾一下之前我们练过的一些操作,相信大家都对插入数据.更新数据.删除数据有了全面的认识. ...
- MySQL学习7 - 外键的变种 三种关系
一 介绍 二 如何找两张表之间的关系 三 表的三种关系 1.书和出版社 2.作者和书籍的关系 3.用户和博客 本节的重点 如何找出两张表之间的关系 表的三种关系 一 介绍 因为有foreign key ...
- 完整性约束&外键变种三种关系&数据的增删改
完整性约束 本节重点: not null 与 default unique primary auto_increment foreign key 一.介绍 约束条件与数据类型的宽度一样,都是可选参数 ...
- MySQL数据库(3)- 完整性约束、外键的变种、单表查询
一.完整性约束 在创建表时候,约束条件和数据类型的宽度都是可选参数. 作用:用于保证数据的完整性和一致性. 1.not null(不可空)与default 示例一:插入一个空值,如下: mysql&g ...
- 【MySQL】外键的变种
" 目录 三种关系 多对一 多对多 一对一 因为有foreign key的约束,使得两张表形成了三种关系: 多对一 多对多 一对多 重点理解如何找出两张表之间的关系 现在有A.B两张表 分析 ...
- MySQL(外键变种)
day58 外键的变种 a. 用户表和部门表 用户: 不唯一 1 alex ...
随机推荐
- svn命令行批量删除和批量添加
svn命令行批量删除和批量添加 如果使用svn的命令行,例如在linux下的终端中使用,svn的添加命令是svn add,删除命令是svn del,但是缺乏批量的操作,如果我在资源管理器中,手动添加了 ...
- 实验8 标准模板库STL
一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...
- 【sqli-labs】 less28 GET- Error based -All you Union&Select Belong to us -String -Single quote with parenthesis(GET型基于错误的去除了Union和Select的单引号带括号字符串型注入)
这个不是基于错误的吧,看源码可以知道错误并没有输出 那就使用;%00和order by试一下 http://192.168.136.128/sqli-labs-master/Less-28/?id=1 ...
- POJ_1061_扩展欧几里德
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 107027 Accepted: 21321 Descript ...
- webpack学习(二)
时下很火的react项目多用到webpack+ES6,本文只实践webpack的打包功能,不涉及react. 1.新建项目 新建的项目,命令模式下切换到项目根路径,用npm init命令生成packa ...
- jdk?jre?
很多人都搞不懂什么是jdk,什么是jre,只知道电脑安装了这两个就能开发和运行java程序,这里我简单讲讲什么是jdk,什么是jre. jdk,即Java Development Kit,故名思意就是 ...
- SharePoint Designer 2013 开启新式验证(Modern Authentication)
首先安装office 2013全家桶 再安装SharePoint Designer 2013 安装完之后,去windows检查更新,并把所有需要更新的都更新了 (更新之后我还通过KMS激活了offic ...
- Django--form组件cookie/session
Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial=None, 初始值 help_ ...
- loadrunner录制不了浏览器
Loadrunner11.0启动WebTours之总结1 第一次安装LR11时,安装安组件后没有对电脑进行重启,直接安装的LR112 安装完毕LR后,录制脚本时发现不能启动IE11.百度发现LR支持I ...
- xe7android调用webservice
1.如果用的roservice,那么用builder打开rodl然后直接生成wsdl保存: 2.由系统IDE的Component中调用import WSDL后save as. 3.调用代码: HTTP ...