"

目录

三种关系

多对一

多对多

一对一


因为有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即可



三种关系

多对一

或者说是一对多

举例:书和出版社

一个出版社可以出版多本书,请看图:


  1. # 创建出版社表
  2. mysql> create table press(
  3. -> id int primary key auto_increment,
  4. -> name varchar(20)
  5. -> );
  6. Query OK, 0 rows affected (0.07 sec)
  7. # 创建书籍表
  8. mysql> create table book(
  9. -> id int primary key auto_increment,
  10. -> name varchar(20),
  11. -> press_id int not null,
  12. -> constraint fk_book_press foreign key(press_id) references press(id)
  13. -> on delete cascade
  14. -> on update cascade
  15. -> );
  16. Query OK, 0 rows affected (0.05 sec)
  17. # 先往被关联表中插入记录
  18. mysql> insert into press(name) values
  19. -> ('北京工业地雷出版社'),
  20. -> ('人民音乐不好听出版社'),
  21. -> ('知识产权没有用出版社');
  22. Query OK, 3 rows affected (0.00 sec)
  23. Records: 3 Duplicates: 0 Warnings: 0
  24. # 再往关联表中插入记录
  25. mysql> insert into book(name, press_id) values
  26. -> ('九阳神功',1),
  27. -> ('九阴真经',2),
  28. -> ('九阴白骨爪',2),
  29. -> ('独孤九剑',3),
  30. -> ('降龙十巴掌',2),
  31. -> ('葵花宝典',3);
  32. Query OK, 6 rows affected (0.04 sec)
  33. Records: 6 Duplicates: 0 Warnings: 0
  34. # 查询结果
  35. mysql> select * from book;
  36. +----+-----------------+----------+
  37. | id | name | press_id |
  38. +----+-----------------+----------+
  39. | 1 | 九阳神功 | 1 |
  40. | 2 | 九阴真经 | 2 |
  41. | 3 | 九阴白骨爪 | 2 |
  42. | 4 | 独孤九剑 | 3 |
  43. | 5 | 降龙十巴掌 | 2 |
  44. | 6 | 葵花宝典 | 3 |
  45. +----+-----------------+----------+
  46. 6 rows in set (0.00 sec)
  47. mysql> select * from press;
  48. +----+--------------------------------+
  49. | id | name |
  50. +----+--------------------------------+
  51. | 1 | 北京工业地雷出版社 |
  52. | 2 | 人民音乐不好听出版社 |
  53. | 3 | 知识产权没有用出版社 |
  54. +----+--------------------------------+
  55. 3 rows in set (0.00 sec)

多对多

举例:作者和书籍的关系

一个作者可以写多本书,一本书也可以有多个作者,即多对多。请看图:


  1. # 创建书籍表
  2. mysql> create table book(
  3. -> id int primary key auto_increment,
  4. -> name varchar(20)
  5. -> );
  6. Query OK, 0 rows affected (0.06 sec)
  7. # 创建作者表
  8. mysql> create table author(
  9. -> id int primary key auto_increment,
  10. -> name varchar(20)
  11. -> );
  12. Query OK, 0 rows affected (0.18 sec)
  13. # 这张表用于记录author表与book表的关系
  14. mysql> create table author2book(
  15. -> id int not null unique auto_increment,
  16. -> author_id int not null,
  17. -> book_id int not null,
  18. -> constraint fk_author foreign key(author_id) references author(id)
  19. -> on delete cascade
  20. -> on update cascade,
  21. -> constraint fk_book foreign key(book_id) references book(id)
  22. -> on delete cascade
  23. -> on update cascade,
  24. -> primary key(author_id,book_id)
  25. -> );
  26. Query OK, 0 rows affected (0.09 sec)
  27. # 插入记录
  28. mysql> insert into author(name) values('egon'), ('alex'), ('wusir'), ('yuanhao');
  29. Query OK, 4 rows affected (0.00 sec)
  30. Records: 4 Duplicates: 0 Warnings: 0
  31. mysql> insert into book(name) values('Python全栈'), ('Linux高级运维'), ('爬虫技术'), ('Web前端');
  32. Query OK, 4 rows affected (0.01 sec)
  33. Records: 4 Duplicates: 0 Warnings: 0
  34. # 插入作者与书籍的对应关系
  35. mysql> insert into author2book(author_id, book_id) values
  36. -> (1, 1),
  37. -> (1, 2),
  38. -> (2, 1),
  39. -> (3, 1),
  40. -> (4, 4),
  41. -> (4, 3);
  42. Query OK, 6 rows affected (0.04 sec)
  43. Records: 6 Duplicates: 0 Warnings: 0
  44. mysql> select * from author2book;
  45. +----+-----------+---------+
  46. | id | author_id | book_id |
  47. +----+-----------+---------+
  48. | 1 | 1 | 1 |
  49. | 2 | 1 | 2 |
  50. | 3 | 2 | 1 |
  51. | 4 | 3 | 1 |
  52. | 5 | 4 | 4 |
  53. | 6 | 4 | 3 |
  54. +----+-----------+---------+
  55. 6 rows in set (0.00 sec)

一对一

举例:用户和博客

一个用户只能注册一个博客,即一对一的关系,请看图:


  1. # 创建用户表
  2. mysql> create table user(
  3. -> id int primary key auto_increment,
  4. -> name varchar(20)
  5. -> );
  6. Query OK, 0 rows affected (0.11 sec)
  7. # 创建博客表
  8. mysql> create table blog(
  9. -> id int primary key auto_increment,
  10. -> url varchar(100),
  11. -> user_id int unique,
  12. -> constraint fk_user foreign key(user_id) references user(id)
  13. -> on delete cascade
  14. -> on update cascade
  15. -> );
  16. Query OK, 0 rows affected (0.08 sec)
  17. # 插入用户表中的记录
  18. mysql> insert into user(name) values('alex'), ('wusir'), ('egon'), ('xiaoma');
  19. Query OK, 4 rows affected (0.04 sec)
  20. Records: 4 Duplicates: 0 Warnings: 0
  21. # 插入博客表的记录
  22. mysql> insert into blog(url, user_id) values
  23. -> ('http:/blog.csdn.net/alex', 1),
  24. -> ('http:/blog.csdn.net/wusir', 2),
  25. -> ('http:/blog.csdn.net/egon', 3),
  26. -> ('http:/blog.csdn.net/xiaoma', 4);
  27. Query OK, 4 rows affected (0.00 sec)
  28. Records: 4 Duplicates: 0 Warnings: 0
  29. # 查找wusir的博客地址
  30. mysql> select url from blog where user_id=2;
  31. +---------------------------+
  32. | url |
  33. +---------------------------+
  34. | http:/blog.csdn.net/wusir |
  35. +---------------------------+
  36. 1 row in set (0.00 sec)


"

【MySQL】外键的变种的更多相关文章

  1. Mysql外键的变种 三种关系

    一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出两张表之间的关系 分析步骤: #1.先站在左表的角度去找 是否左表的多条记录可以 ...

  2. Mysql -- 外键的变种 三种关系

    一.介绍 因为有foreign  key的约束,  使得两张表形成了三种关系 多对一      多对多   一对一 二.如果找出两张表之间的关系 #.先站在左表的角度去找 是否左表的多条记录可以对应右 ...

  3. MySQL数据库(3)- 完整性约束、外键的变种、单表查询

    一.完整性约束 在创建表时候,约束条件和数据类型的宽度都是可选参数. 作用:用于保证数据的完整性和一致性. 1.not null(不可空)与default 示例一:插入一个空值,如下: mysql&g ...

  4. MySQL(外键变种)

    day58 外键的变种                  a. 用户表和部门表                      用户:        不唯一                1 alex    ...

  5. MySQL之唯一索引、外键的变种、SQL语句数据行操作补充

    0.唯一索引 unique对num进行唯一限制,表示num是独一无二的,uql是唯一索引名称 上面为联合索引:num和xx不能完全一样  1.外键的变种 a. 用户表和部门表 用户: 1 alex 1 ...

  6. python 全栈开发,Day62(外键的变种(三种关系),数据的增删改,单表查询,多表查询)

    一.外键的变种(三种关系) 本节重点: 如何找出两张表之间的关系 表的三种关系 一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出 ...

  7. MySQL 外键 表的查询

    自增补充 这是查看怎么创建的表, \G示旋转90度显示表的内容 表的自增的关键是** AUTO_INCREMENT=3**,在表中添加数据后,这个会自动改变,通过alert可以改变这个默认值 mysq ...

  8. day03 mysql外键 表的三种关系 单表查询 navicat

    day03 mysql navicat   一.完整性约束之     外键 foreign key     一个表(关联表: 是从表)设置了外键字段的值, 对应的是另一个表的一条记录(被关联表: 是主 ...

  9. mysql 外键约束备注

    梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...

  10. MySQL外键之级联

    简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...

随机推荐

  1. Java开发新闻管理系统(前后端)+爬虫百度、新浪等新闻

                  ForFuture News  新闻管理系统                      项目演示地址:http://www.ganquanzhong.top [注]:文档下 ...

  2. Apache-Tomcat-Ajp漏洞(CVE-2020-1938)漏洞复现(含有poc)

    Apache-Tomcat-Ajp漏洞(CVE-2020-1938)漏洞复现 0X00漏洞简介 Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可 ...

  3. python skimage库的安装

    skimage库需要依赖 numpy+mkl 和scipy 1.打开运行,输入cmd回车,输入python回车,查看python版本

  4. Solr与对应Jdk版本的关系

    Solr各版本下载地址:http://archive.apache.org/dist/lucene/solr/ 下载的包里面的CHANGES.txt 有当前版本需要的说明.

  5. 1069 The Black Hole of Numbers (20分)

    1069 The Black Hole of Numbers (20分) 1. 题目 2. 思路 把输入的数字作为字符串,调用排序算法,求最大最小 3. 注意点 输入的数字的范围是(0, 104), ...

  6. HDU4714 Tree2cycle 解题报告

    题意 给定一棵无根树,删除或连接一条边的代价为\(1\),求把树变为环的最小代价. 前置思路 如果删除了\(k\)条边,使得树变成\((k+1)\)条链,再用\((k+1)\)次连接操作把树变成一个环 ...

  7. NOIP2012 疫情控制 题解(LuoguP1084)

    NOIP2012 疫情控制 题解(LuoguP1084) 不难发现,如果一个点向上移动一定能控制更多的点,所以可以二分时间,判断是否可行. 但根节点不能不能控制,存在以当前时间可以走到根节点的点,可使 ...

  8. Python - 安装 - 在 Alpine Linux 下安装 Python2

    概述 在 Alpine Liunx 下安装 python2 感觉又是水了一发... 感觉还是有点丢人, 就像在帮小学生写作业, 写完了后还想找人夸我... 最近看 docker 和 jenkins, ...

  9. Go_sql注入

    我们任何时候都不应该自己拼接SQL语句! sqlInjectDemo("xxx' or 1=1#") sqlInjectDemo("xxx' union select * ...

  10. [AGC027A]Candy Distribution Again

    Description AGC027A 你有一些糖果,你要把这些糖果一个不剩分给一些熊孩子,但是这帮熊孩子只要特定数目的糖果,否则就会不开心,求最多的开心人数. Solution 如果\(\sum a ...