MySQL数据库表关系详解

(1)一对一

  • 一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里面

  • 一对一的关系就是一种特殊的多对多的关系,一张表A中的一条记录只能对应另一张表B中的一条记录,另一张表B中的一条记录也只能对应一张表A中的一条记录
  • 例如:

学生表student:

id name

1001 张三

1002 张四

学生卡表card:

id name

111 card1

222 card2

  • 这里的一个学生只能对应一张学生卡,一张学生卡只能对应一个学生,那么学生和学生卡就是一对一的关系

  • 一对一设计方案:唯一外键:(外键加一个唯一性约束)

    唯一外键是一对一设计推荐的方法,顾名思义,也是需要给某个表添加外键,但是该外键必须有唯一性约束,通俗来说就是该外键不能有重复

  • 假设给学生卡表添加外键:

学生表student

id name

1001 张三

1002 张四

学生卡表card

id name stuent_id(设计表时给该字段添加唯一性约束)

111 card1 1001

222 card2 1002

  • 查询张三的学生卡信息
SELECT * FROM card c JOIN student s ON c.student_id=s.id
WHERE s.name='张三'
  • 在这里就直接当成多对多使用即可,所以一对一和多对多语法上并没有什么太大区别,只是在外键处加了一个唯一性约束

(2)一对多

  • 一对多是最基础的表间关系,意思是一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录只能对应一张表A中的一条记录

  • 班级是1端,学生是多端, 结合面向对象的思想,1端是父亲,多端是儿子,所以多端具有1端的属性,也就是说多端里面应该放置1端的主键,那么学生表里面应该放置班级表里面的主键

  • 举个一对多的例子:有两张表

表A:学生表student(子表)

id name class_id(外键非空:班级id)

1001 张三 111

1002 张四 222

1003 王五 111

1004 赵六 111

表B:班级表class(父表)

id name

111 class1

222 class2

  • 一个班级对应多个学生,一个学生只能对应一个班级,所以这两个表的关系也就很明确了:
  • 班级表中的一条记录可以对应学生表的多条数据,学生表中的一条记录只能对应班级表的一条数据;
  • 查询案例:查询所有姓张的学生的id,name和所在班级name
SELECT s.id,s.name,c.name as className FROM
student s JOIN class c ON s.class_id=c.id
WHERE s.name LIKE '张%'

在一对多关系中需要注意以下几点:

  • 添加数据时,先添加父表(class)记录,再添加子表(student)记录;(比如增加一个学生而他的班级是class3,父表没有该班级需要先添加)
  • 删除数据时,先删除子表(student)记录,再删除父表(class)记录;(比如删除一个学生且只有他的班级是class2,先删除学生后再删除父表的class2)

在设计表时,可以遵循以下口诀: 一对多,两张表,多的表加外键

在一对多的关系中,存在两张表(一张父表一张子表),父表的一条数据对应子表的多条数据,那么子表(多)就需要添加上父表(一)的外键字段

(3)多对多

  • 多对多的意思是: 一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录也可以对应一张表A中的多条记录

  • 对于多对多关系,需要转换成1对多关系,那么就需要一张中间表来转换,这张中间表里面需要存放学生表里面的主键和课程表里面的主键,此时学生与中间表示1对多关系,课程与中间表是1对多关系,学生与课程是多对多关系

学生表student:

id name

1001 张三

1002 张四

1003 王五

1004 赵六

课程表course:

id name

111 java

222 mysql

  • 这两张表就是多对多的关系,因为一个学生可以选择多门课程,一门课程可以被多个学生选择;
  • 那么这样不论给哪个表添加外键都不行,这时就需要额外创建一个关系表来存放这两张表的id键值:
  • 学生课程关系表student_course_relation(关系表):

student_id course_id

1001 111

1001 222

1002 111

1002 222

  • 这样就可以分开来看了:
  • 学生表和关系表就是一对多的关系,课程表和关系表也是一对多的关系
  • 查询案例:查询所有姓张的学生的id、name和所选课程的name
SELECT s.id, s.name, c.name FROM
student s JOIN student_course_relation scr
ON scr.student_id=s.id
JOIN course c ON scr.course_id=c.id
WHEREs.name LIKE '张%'
  • 注:父表和子表的确认关系是:谁先生成谁是父表。

  • 上述一对多例子中必须要先生成1端的表,才能有多端的表,因此父表为班级表。

  • 而多对多的例子中则是给两张表(学生和课程)建立关联关系,需要在关系表子表中添加新的记录关联两张父表,因此父表为先生成的学生和课程表。

  • 在多对多设计表时,可以遵循以下口诀:

  • 多对多,三张表,关系表加外键!!!

  • 意思就是当存在多对多的关系时,需要涉及到第三张表关系表的设计,而关系表就是存放了存在多对多关系的两张表的外键;

(4)总结

  • 在写sql语句中最重要的就是找表之间的关系,只有搞清楚各种表之间的联系,才不容易出错;
  • 这两句口诀再强调一下:
  • 一对多,两张表,多的表加外键
  • 多对多,三张表,关系表加外键

MySQL数据库表关系详解的更多相关文章

  1. mysql数据库表分区详解(数量过大的数据库表通过分区提高查询速度)

    这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...

  2. 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现

    重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...

  3. (转)Mysql 多表查询详解

    MySQL 多表查询详解 一.前言  二.示例 三.注意事项 一.前言  上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...

  4. MySQL的表分区详解

    这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...

  5. MYSQL数据库引擎区别详解

    数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另 ...

  6. linux脚本定时备份数据库表(详解)

    数据库备份策略 备份的数据库 服务器:10.10.10.254.10.2.11.10 数据库:gps6 备份的表: user_info alarminfo electronic_fence jpush ...

  7. Mysql数据库配置参数详解大全

    名称 是否需要重启 值 允许值 描述 auto_increment_increment 否 1 1-65,535 auto_increment_increment和auto_increment_off ...

  8. MySQL数据库图文安装详解及相关问题

    (尊重劳动成果,转载请注明出处: http://blog.csdn.net/qq_25827845/article/details/53366444冷血之心的博客) 首先说明:安装目录中不能有中文和空 ...

  9. linux/Ubuntu系统上安装mysql数据库(附图详解)

    在前面的文章中,我已经分享了如何在Ubuntu系统中安装以及搭建java开发环境,那么当我们需要跟数据打交道的时候,那么就需要在ubuntu系统中安装一个数据库了,那么废话就不多说了,我们这里主要是分 ...

  10. MySQL数据库的锁详解【转】

    当然在我们的数据库中也有锁用来控制资源的并发访问,这也是数据库和文件系统的区别之一. 为什么要懂数据库锁? 通常来说对于一般的开发人员,在使用数据库的时候一般懂点 DQL(select),DML(in ...

随机推荐

  1. linux下nginx常用命令

    1.查找nginx路径:whereis nginx2.启动 service nginx start3.查看Nginx的版本号:nginx -V4.停止 nginx -s stop5.退出 nginx ...

  2. 学习Kotlin语法(二)

    简介 经过上一章节,我们对Kotlin基础语法有了大致的了解,了解了什么是基本类型.集合.控制流程.函数.类.空安全,接下来我们将更近一步的去了解Kotlin的相关知识,本章节将详细的学习Kotlin ...

  3. java基础之数据结构

    一.栈:stack,又称堆栈[出口和入口在同一侧],特点:先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素) 例子:子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当 ...

  4. Linux内核中块层上的多队列

    如果你想知道SSD为什么使用多队列,可以看看这篇文章:https://kernel.dk/blk-mq.pdf 1. 多块层 以下关于多队列层的总结来自 The Multi-Queue Interfa ...

  5. TCP连接(Netty)

    启动类增加 public static void main(String[] args) { SpringApplication application = new SpringApplication ...

  6. ES-问题:memory locking requested for elasticsearch process but memory is not locked

    错误信息: [2019-11-21T00:29:51,557][ERROR][o.e.b.Bootstrap          ] [elk-1] node validation exception ...

  7. grafana最新任意文件读取

    一.Grafana简介 Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知.它主要有以下六大特点: 1.展示方式:快速灵活的客户端图表,面板插 ...

  8. <HarmonyOS第一课02>DevEco Studio的使用

    视频链接: https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717494752698457?ha_sou ...

  9. 【记录】ChatGPT|近期三次更新一览(更新至2023年2月3日)

      如果你还没有使用过ChatGPT,可以先看看我的上一篇文章:[记录]ChatGPT|使用技巧与应用推荐(更新至2023年2月8日).   1月11号晚上,ChatGPT突然很多人都无法登录,包括我 ...

  10. django实例(2)

    S14day19---->urls.py from django.contrib import adminfrom django.conf.urls import url,includeurlp ...