"

目录

三种关系

多对一

多对多

一对一


因为有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. Working copy not locked; this is probably a bug, please report

    问题描述 svn: Unable to lock 'G:\chengXu\2017_Year\JFW\Easy7\src' 解决方案

  2. cookie 与 session区别

    cookie 与 session 是网页开发中常用的信息存储方式.Cookie是在客户端开辟的一块可存储用户信息的地方:Session是在服务器内存中开辟的一块存储用户信息的地方.JavaScript ...

  3. Hibernate的基本工作原理

    Hibernate开发过程中会用到5个核心接口: 1.Configuration2.SessionFactory3.Session4.Transaction5.QueryHibernate就是通过这些 ...

  4. POJ3273 Monthly Expense (二分最小化花费)

    链接:http://poj.org/problem?id=3273 题意:FJ想把n天分成m组,每组是连续的,同一组的花费加起来算,求所分组情况中最高花费的最低值 思路:二分答案.二分整数范围内的花费 ...

  5. vue-cli脚手架创建vue项目

    CLI 使用vue-cli可以快速搭建Vue开发环境以及对应的webpack配置 cnpm install -g @vue/cli // 如果需要使用旧版本的vue init功能(脚手架2),你可以全 ...

  6. Python 实现深度学习

    前言 最近由于疫情被困在家,于是准备每天看点专业知识,准备写成博客,不定期发布. 博客大概会写5~7篇,主要是"解剖"一些深度学习的底层技术.关于深度学习,计算机专业的人多少都会了 ...

  7. 松软科技课堂:jQuery 语法

    jQuery 语法 jQuery 语法是为 HTML 元素的选取编制的,可以对元素执行某些操作. 基础语法是:$(selector).action() 美元符号定义 jQuery 选择符(select ...

  8. Bootstrap框架学习

    Bootstrap框架个人总结 https://blog.csdn.net/To_Front_End/article/details/51142716 Bootstrap 教程 https://www ...

  9. windows 下安装memcache拓展

    Windows下安装memcached (linux 接下来会继续 学习) 以管理员身份进入CMD 模式,具体方法:C:/windows/system32 管理员身份打开cmd.exe memcach ...

  10. 题解 P1453 【城市环路】

    P1453 城市环路 感觉基环树(or环套树)的题目一般都是找到树上的环,断掉一条边再进行树上的操作(如noip2018P5022 旅行) 双倍经验:P2607 [ZJOI2008]骑士 P1453和 ...