本节重点:

  • 如何找出两张表之间的关系
  • 表的三种关系

一、介绍

因为有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 cascadeon 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 cascadeon update cascade,constraint fk_book foreign key(book_id) references book(id)on delete cascadeon 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 cascadeon 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;

用户和博客(一对一)

转载于:https://www.cnblogs.com/dalaoban/p/9562724.html

09-Mysql数据库----外键的变种相关推荐

  1. mysql数据库 外键约束

    外部关键字 在以后我们统一将外部关键字叫做外键,外键就是另一张表中的主键. 问:外键有啥用啊? 答:外键的主要作用就是保持数据的一致性,完整性. 再问:怎么保证的呢? 答:看图. 如图有两张表,cla ...

  2. navicat --mysql数据库外键约束及其外键策略

    一,什么是外键约束 外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的.外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性. 外键是指 ...

  3. mysql修改级联表数据_MySQL数据库 外键,级联, 修改表的操作

    1.外键: 用来建立两张表之间的关系 - 一对多 - 多对多 - 一对一 研究表与表之间的关系: 1.定义一张 员工部门表 id, name, gender, dep_name, dep_desc - ...

  4. wamp mysql外键设置_数据库外键是什么意思

    数据库外键是什么意思? 外键(FK)是用于建立和加强两个表数据之间的链接的一列或多列.通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接.这个列就成为第二个表的外键. 当创建或更 ...

  5. mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...

  6. MySQL的外键约束

    一.MySQL外键 外键表示一个表中的一个字段被另一个表中的一个字段引用.外键对相关表中的数据造成了限制,使MySQL的能够保持参照完整性.只有InnoDB类型的表才可以使用外键. 1.外键的好处 可 ...

  7. 数据库 外键 优缺点_不同数据格式的优缺点:键值与元组

    数据库 外键 优缺点 by Hieu Nguyen (Jack) 由Hieu Nguyen(Jack) 不同数据格式的优缺点:键值与元组 (The pros and cons of different ...

  8. mysql 设置外键

    数据库 mysql 建立外键的前提:本表的列必须与外键类型相同(外键 必须是外表主键). 外键作用: 使两张表形成关联,外键只能引用外表中的列的值! 指定主键关键字: foreign key(列名) ...

  9. mysql创建外键级联更新_MySQL使用外键实现级联删除与更新的方法

    本文实例讲述了MySQL使用外键实现级联删除与更新的方法.分享给大家供大家参考,具体如下: MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时 ...

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

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

最新文章

  1. 银光中国网免费Silverlight空间Web Service部署方法
  2. 发布订阅模式 仿写Vue事件监听手写js实现
  3. 应用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space)
  4. 深度剖析RPC框架的核心设计
  5. Max retries exceeded with URL报错小记
  6. Java中数学计算的相关方法
  7. java web fileupload_javaweb 文件上传(fileupload) 下载
  8. 在C#中使用DevExpress中的ChartControl实现极坐标图
  9. 发动机压缩比怎么计算公式_精准的发动机压缩比计算方法与流程
  10. Hightopo 受邀参加第二十三届中国国际高新技术成果交易会
  11. flac编码音频转alac编码(使用ffmpeg)
  12. backdrop-filter: blur() safari 浏览器 无效 解决
  13. Makerbase_ODrive常见驱动问题及解决
  14. OSWE 尾篇 考试的方法论
  15. windows 组策略
  16. java基础练习_Java基础练习题
  17. IBM z15揭开面纱,多项业界首创技术护航混合多云安全
  18. wordpress创建_如何在WordPress中创建问卷(简易方式)
  19. 圣斗士星矢正义传说服务器维护,圣斗士星矢正义传说最佳运营攻略
  20. Jvav 调用 Conflux 智能合约

热门文章

  1. python 实现简单画板_Python图像处理之简单画板实现方法示例
  2. linux下查看进程与线程
  3. java输出日期_java输出日期时间
  4. 戴尔optiplex3020主板接线_戴尔XPS 13 2020上手,12999元的高端精致怪,让苹果也很有压力!...
  5. maker 预测_Nature | 计算机首次预测天然产物逆合成路线—与人类不相上下!
  6. linux有名管道 复用,Linux进程间通信(九)---综合实验之有名管道通信实验
  7. mysql 循环语句语法_MySQL循环语句之while循环测试
  8. 翻译: 构建基于卡尔曼滤波器的 IMU 用速度数据改进 IMU 姿态估计
  9. 翻译:自动驾驶相关术语的分类和定义Taxonomy and Definitions for Terms Related to On-Road Motor Vehicle Automated
  10. swift5 修改Accessibility order读取的顺序