一、介绍

因为有foreign key的约束,使得两张表形成了三种了关系:

  • 多对一
  • 多对多
  • 一对一

二、重点理解如果找出两张表之间的关系

  1. 分析步骤:
  2. #1、先站在左表的角度去找
  3. 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id
  4.  
  5. #2、再站在右表的角度去找
  6. 是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id
  7.  
  8. #3、总结:
  9. #多对一:
  10. 如果只有步骤1成立,则是左表多对一右表
  11. 如果只有步骤2成立,则是右表多对一左表
  12.  
  13. #多对多
  14. 如果步骤12同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系
  15.  
  16. #一对一:
  17. 如果12都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可

三、表的三种关系

(1)书和出版社

  一对多(或多对一):一个出版社可以出版多本书。看图说话。

  关联方式:foreign key

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

书和出版社(多对一)

(2)作者和书籍的关系

  多对多:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多。看图说话。

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

  1. # 创建被关联表author表,之前的book表在讲多对一的关系已创建
  2. create table author(
  3. id int primary key auto_increment,
  4. name varchar(20)
  5. );
  6. #这张表就存放了author表和book表的关系,即查询二者的关系查这表就可以了
  7. create table author2book(
  8. id int not null unique auto_increment,
  9. author_id int not null,
  10. book_id int not null,
  11. constraint fk_author foreign key(author_id) references author(id)
  12. on delete cascade
  13. on update cascade,
  14. constraint fk_book foreign key(book_id) references book(id)
  15. on delete cascade
  16. on update cascade,
  17. primary key(author_id,book_id)
  18. );
  19. #插入四个作者,id依次排开
  20. insert into author(name) values('egon'),('alex'),('wusir'),('yuanhao');
  21.  
  22. # 每个作者的代表作
  23. egon: 九阳神功、九阴真经、九阴白骨爪、独孤九剑、降龙十巴掌、葵花宝典
  24. alex: 九阳神功、葵花宝典
  25. wusir:独孤九剑、降龙十巴掌、葵花宝典
  26. yuanhao:九阳神功
  27.  
  28. # 在author2book表中插入相应的数据
  29.  
  30. insert into author2book(author_id,book_id) values
  31. (1,1),
  32. (1,2),
  33. (1,3),
  34. (1,4),
  35. (1,5),
  36. (1,6),
  37. (2,1),
  38. (2,6),
  39. (3,4),
  40. (3,5),
  41. (3,6),
  42. (4,1)
  43. ;
  44. # 现在就可以查author2book对应的作者和书的关系了
  45. mysql> select * from author2book;
  46. +----+-----------+---------+
  47. | id | author_id | book_id |
  48. +----+-----------+---------+
  49. | 1 | 1 | 1 |
  50. | 2 | 1 | 2 |
  51. | 3 | 1 | 3 |
  52. | 4 | 1 | 4 |
  53. | 5 | 1 | 5 |
  54. | 6 | 1 | 6 |
  55. | 7 | 2 | 1 |
  56. | 8 | 2 | 6 |
  57. | 9 | 3 | 4 |
  58. | 10 | 3 | 5 |
  59. | 11 | 3 | 6 |
  60. | 12 | 4 | 1 |
  61. +----+-----------+---------+
  62. 12 rows in set (0.00 sec)

作者与书籍关系(多对多)

(3)用户和博客

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

  关联方式:foreign key+unique

  1. #例如: 一个用户只能注册一个博客
  2.  
  3. #两张表: 用户表 (user)和 博客表(blog)
  4. # 创建用户表
  5. create table user(
  6. id int primary key auto_increment,
  7. name varchar(20)
  8. );
  9. # 创建博客表
  10. create table blog(
  11. id int primary key auto_increment,
  12. url varchar(100),
  13. user_id int unique,
  14. constraint fk_user foreign key(user_id) references user(id)
  15. on delete cascade
  16. on update cascade
  17. );
  18. #插入用户表中的记录
  19. insert into user(name) values
  20. ('alex'),
  21. ('wusir'),
  22. ('egon'),
  23. ('xiaoma')
  24. ;
  25. # 插入博客表的记录
  26. insert into blog(url,user_id) values
  27. ('http://www.cnblog/alex',1),
  28. ('http://www.cnblog/wusir',2),
  29. ('http://www.cnblog/egon',3),
  30. ('http://www.cnblog/xiaoma',4)
  31. ;
  32. # 查询wusir的博客地址
  33. select url from blog where user_id=2;

用户和博客(一对一)

Mysql外键的变种 三种关系的更多相关文章

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

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

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

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

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

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

  4. mysql更新(五) 完整性约束 外键的变种 三种关系 数据的增删改

    11-数据的增删改   本节重点: 插入数据 INSERT 更新数据 UPDATE 删除数据 DELETE 再来回顾一下之前我们练过的一些操作,相信大家都对插入数据.更新数据.删除数据有了全面的认识. ...

  5. MySQL学习7 - 外键的变种 三种关系

    一 介绍 二 如何找两张表之间的关系 三 表的三种关系 1.书和出版社 2.作者和书籍的关系 3.用户和博客 本节的重点 如何找出两张表之间的关系 表的三种关系 一 介绍 因为有foreign key ...

  6. 完整性约束&外键变种三种关系&数据的增删改

    完整性约束 本节重点: not null 与 default unique primary auto_increment foreign key 一.介绍 约束条件与数据类型的宽度一样,都是可选参数 ...

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

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

  8. 【MySQL】外键的变种

    " 目录 三种关系 多对一 多对多 一对一 因为有foreign key的约束,使得两张表形成了三种关系: 多对一 多对多 一对多 重点理解如何找出两张表之间的关系 现在有A.B两张表 分析 ...

  9. MySQL(外键变种)

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

随机推荐

  1. svn命令行批量删除和批量添加

    svn命令行批量删除和批量添加 如果使用svn的命令行,例如在linux下的终端中使用,svn的添加命令是svn add,删除命令是svn del,但是缺乏批量的操作,如果我在资源管理器中,手动添加了 ...

  2. 实验8 标准模板库STL

    一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...

  3. 【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 ...

  4. POJ_1061_扩展欧几里德

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 107027   Accepted: 21321 Descript ...

  5. webpack学习(二)

    时下很火的react项目多用到webpack+ES6,本文只实践webpack的打包功能,不涉及react. 1.新建项目 新建的项目,命令模式下切换到项目根路径,用npm init命令生成packa ...

  6. jdk?jre?

    很多人都搞不懂什么是jdk,什么是jre,只知道电脑安装了这两个就能开发和运行java程序,这里我简单讲讲什么是jdk,什么是jre. jdk,即Java Development Kit,故名思意就是 ...

  7. SharePoint Designer 2013 开启新式验证(Modern Authentication)

    首先安装office 2013全家桶 再安装SharePoint Designer 2013 安装完之后,去windows检查更新,并把所有需要更新的都更新了 (更新之后我还通过KMS激活了offic ...

  8. Django--form组件cookie/session

    Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial=None, 初始值 help_ ...

  9. loadrunner录制不了浏览器

    Loadrunner11.0启动WebTours之总结1 第一次安装LR11时,安装安组件后没有对电脑进行重启,直接安装的LR112 安装完毕LR后,录制脚本时发现不能启动IE11.百度发现LR支持I ...

  10. xe7android调用webservice

    1.如果用的roservice,那么用builder打开rodl然后直接生成wsdl保存: 2.由系统IDE的Component中调用import WSDL后save as. 3.调用代码: HTTP ...