【MySQL】外键的变种
"
目录
因为有foreign key的约束,使得两张表形成了三种关系:
- 多对一
- 多对多
- 一对多
重点理解如何找出两张表之间的关系
现在有A、B两张表
分析步骤:1. 先站在A表的角度去找
:是否A表的多条记录可以对应B表的一条记录,如果是,则证明A表的一个字段 foreign key B表的一个字段(通常是id).2. 再站在B表的角度去找
:是否B表的多条记录可以对应A表的一条记录,如果是,则证明B表的一个字段 foreign key A表的一个字段(通常是id).3. 总结:
多对一
如果是步骤1成立,则是A表多对一B表
如果是步骤2成立,则是B表多对一A表多对多
如果步骤1和步骤2同时成立,则证明这两张表是一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系.一对一
如果1和2都不成立,而是A表的一条记录唯一对应B表的一条记录,反之亦然。这种情况很简单,就是在A表 foreign key B表的基础上,将A表的外键字段设置成unique即可
三种关系
多对一
或者说是一对多
举例:书和出版社
一个出版社可以出版多本书,请看图:

-
# 创建出版社表
-
mysql> create table press(
-
-> id int primary key auto_increment,
-
-> name varchar(20)
-
-> );
-
Query OK, 0 rows affected (0.07 sec)
-
-
# 创建书籍表
-
mysql> 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
-
-> );
-
Query OK, 0 rows affected (0.05 sec)
-
-
# 先往被关联表中插入记录
-
mysql> insert into press(name) values
-
-> ('北京工业地雷出版社'),
-
-> ('人民音乐不好听出版社'),
-
-> ('知识产权没有用出版社');
-
Query OK, 3 rows affected (0.00 sec)
-
Records: 3 Duplicates: 0 Warnings: 0
-
-
# 再往关联表中插入记录
-
mysql> insert into book(name, press_id) values
-
-> ('九阳神功',1),
-
-> ('九阴真经',2),
-
-> ('九阴白骨爪',2),
-
-> ('独孤九剑',3),
-
-> ('降龙十巴掌',2),
-
-> ('葵花宝典',3);
-
Query OK, 6 rows affected (0.04 sec)
-
Records: 6 Duplicates: 0 Warnings: 0
-
-
# 查询结果
-
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)
多对多
举例:作者和书籍的关系
一个作者可以写多本书,一本书也可以有多个作者,即多对多。请看图:

-
# 创建书籍表
-
mysql> create table book(
-
-> id int primary key auto_increment,
-
-> name varchar(20)
-
-> );
-
Query OK, 0 rows affected (0.06 sec)
-
-
# 创建作者表
-
mysql> create table author(
-
-> id int primary key auto_increment,
-
-> name varchar(20)
-
-> );
-
Query OK, 0 rows affected (0.18 sec)
-
-
# 这张表用于记录author表与book表的关系
-
mysql> 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)
-
-> );
-
Query OK, 0 rows affected (0.09 sec)
-
-
-
# 插入记录
-
mysql> insert into author(name) values('egon'), ('alex'), ('wusir'), ('yuanhao');
-
Query OK, 4 rows affected (0.00 sec)
-
Records: 4 Duplicates: 0 Warnings: 0
-
-
mysql> insert into book(name) values('Python全栈'), ('Linux高级运维'), ('爬虫技术'), ('Web前端');
-
Query OK, 4 rows affected (0.01 sec)
-
Records: 4 Duplicates: 0 Warnings: 0
-
-
# 插入作者与书籍的对应关系
-
mysql> insert into author2book(author_id, book_id) values
-
-> (1, 1),
-
-> (1, 2),
-
-> (2, 1),
-
-> (3, 1),
-
-> (4, 4),
-
-> (4, 3);
-
Query OK, 6 rows affected (0.04 sec)
-
Records: 6 Duplicates: 0 Warnings: 0
-
-
mysql> select * from author2book;
-
+----+-----------+---------+
-
| id | author_id | book_id |
-
+----+-----------+---------+
-
| 1 | 1 | 1 |
-
| 2 | 1 | 2 |
-
| 3 | 2 | 1 |
-
| 4 | 3 | 1 |
-
| 5 | 4 | 4 |
-
| 6 | 4 | 3 |
-
+----+-----------+---------+
-
6 rows in set (0.00 sec)
一对一
举例:用户和博客
一个用户只能注册一个博客,即一对一的关系,请看图:

-
# 创建用户表
-
mysql> create table user(
-
-> id int primary key auto_increment,
-
-> name varchar(20)
-
-> );
-
Query OK, 0 rows affected (0.11 sec)
-
-
# 创建博客表
-
mysql> 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
-
-> );
-
Query OK, 0 rows affected (0.08 sec)
-
-
# 插入用户表中的记录
-
mysql> insert into user(name) values('alex'), ('wusir'), ('egon'), ('xiaoma');
-
Query OK, 4 rows affected (0.04 sec)
-
Records: 4 Duplicates: 0 Warnings: 0
-
-
# 插入博客表的记录
-
mysql> insert into blog(url, user_id) values
-
-> ('http:/blog.csdn.net/alex', 1),
-
-> ('http:/blog.csdn.net/wusir', 2),
-
-> ('http:/blog.csdn.net/egon', 3),
-
-> ('http:/blog.csdn.net/xiaoma', 4);
-
Query OK, 4 rows affected (0.00 sec)
-
Records: 4 Duplicates: 0 Warnings: 0
-
-
# 查找wusir的博客地址
-
mysql> select url from blog where user_id=2;
-
+---------------------------+
-
| url |
-
+---------------------------+
-
| http:/blog.csdn.net/wusir |
-
+---------------------------+
-
1 row in set (0.00 sec)
"
【MySQL】外键的变种的更多相关文章
- Mysql外键的变种 三种关系
一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出两张表之间的关系 分析步骤: #1.先站在左表的角度去找 是否左表的多条记录可以 ...
- Mysql -- 外键的变种 三种关系
一.介绍 因为有foreign key的约束, 使得两张表形成了三种关系 多对一 多对多 一对一 二.如果找出两张表之间的关系 #.先站在左表的角度去找 是否左表的多条记录可以对应右 ...
- MySQL数据库(3)- 完整性约束、外键的变种、单表查询
一.完整性约束 在创建表时候,约束条件和数据类型的宽度都是可选参数. 作用:用于保证数据的完整性和一致性. 1.not null(不可空)与default 示例一:插入一个空值,如下: mysql&g ...
- MySQL(外键变种)
day58 外键的变种 a. 用户表和部门表 用户: 不唯一 1 alex ...
- MySQL之唯一索引、外键的变种、SQL语句数据行操作补充
0.唯一索引 unique对num进行唯一限制,表示num是独一无二的,uql是唯一索引名称 上面为联合索引:num和xx不能完全一样 1.外键的变种 a. 用户表和部门表 用户: 1 alex 1 ...
- python 全栈开发,Day62(外键的变种(三种关系),数据的增删改,单表查询,多表查询)
一.外键的变种(三种关系) 本节重点: 如何找出两张表之间的关系 表的三种关系 一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出 ...
- MySQL 外键 表的查询
自增补充 这是查看怎么创建的表, \G示旋转90度显示表的内容 表的自增的关键是** AUTO_INCREMENT=3**,在表中添加数据后,这个会自动改变,通过alert可以改变这个默认值 mysq ...
- day03 mysql外键 表的三种关系 单表查询 navicat
day03 mysql navicat 一.完整性约束之 外键 foreign key 一个表(关联表: 是从表)设置了外键字段的值, 对应的是另一个表的一条记录(被关联表: 是主 ...
- mysql 外键约束备注
梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...
- MySQL外键之级联
简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...
随机推荐
- Java开发新闻管理系统(前后端)+爬虫百度、新浪等新闻
ForFuture News 新闻管理系统 项目演示地址:http://www.ganquanzhong.top [注]:文档下 ...
- Apache-Tomcat-Ajp漏洞(CVE-2020-1938)漏洞复现(含有poc)
Apache-Tomcat-Ajp漏洞(CVE-2020-1938)漏洞复现 0X00漏洞简介 Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可 ...
- python skimage库的安装
skimage库需要依赖 numpy+mkl 和scipy 1.打开运行,输入cmd回车,输入python回车,查看python版本
- Solr与对应Jdk版本的关系
Solr各版本下载地址:http://archive.apache.org/dist/lucene/solr/ 下载的包里面的CHANGES.txt 有当前版本需要的说明.
- 1069 The Black Hole of Numbers (20分)
1069 The Black Hole of Numbers (20分) 1. 题目 2. 思路 把输入的数字作为字符串,调用排序算法,求最大最小 3. 注意点 输入的数字的范围是(0, 104), ...
- HDU4714 Tree2cycle 解题报告
题意 给定一棵无根树,删除或连接一条边的代价为\(1\),求把树变为环的最小代价. 前置思路 如果删除了\(k\)条边,使得树变成\((k+1)\)条链,再用\((k+1)\)次连接操作把树变成一个环 ...
- NOIP2012 疫情控制 题解(LuoguP1084)
NOIP2012 疫情控制 题解(LuoguP1084) 不难发现,如果一个点向上移动一定能控制更多的点,所以可以二分时间,判断是否可行. 但根节点不能不能控制,存在以当前时间可以走到根节点的点,可使 ...
- Python - 安装 - 在 Alpine Linux 下安装 Python2
概述 在 Alpine Liunx 下安装 python2 感觉又是水了一发... 感觉还是有点丢人, 就像在帮小学生写作业, 写完了后还想找人夸我... 最近看 docker 和 jenkins, ...
- Go_sql注入
我们任何时候都不应该自己拼接SQL语句! sqlInjectDemo("xxx' or 1=1#") sqlInjectDemo("xxx' union select * ...
- [AGC027A]Candy Distribution Again
Description AGC027A 你有一些糖果,你要把这些糖果一个不剩分给一些熊孩子,但是这帮熊孩子只要特定数目的糖果,否则就会不开心,求最多的开心人数. Solution 如果\(\sum a ...