mysql多表关系

多表关系是关系型数据库特有的

三种关系

一对一关系

一对多关系

多对多关系

总结

一对一

例子:用户和用户信息

外键设置在用户上,外键字段唯一非空

添加

无级联:先增加被关联表记录(用户信息表),再增加关联表记录(用户表)

级联:相同

删除

无级联:先删除关联表记录,再删除被关联表记录

级联:可以直接先删除被关联的记录,直接删除两张表

修改

无级联:关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)

级联:可以直接修改

  1. detail_id int unique not null,
  2. foreign key(detail_id) references author_detail(id)
  1. on update cascade
  2. on delete cascade

一对多

例子:购物车和商品

外键必须放在多的一方(商品),此刻外键不唯一

添加

无级联:先增加被关联表记录(购物车),再增加关联表记录(商品)

级联:相同

删除

无级联:先删除关联表记录,再删除被关联表记录

级联:可以直接先删除被关联的记录,直接删除相关联的所有表

修改

无级联:关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)

级联:可以直接修改,并修改相关联的表

  1. author_id int,
  2. foreign key(author_id) references author(id)
  1. on update cascade
  2. on delete cascade

多对多

例子:学生和课程

会创建一张第三方关系表,每一个外键值不唯一,可以看做是外键的联合唯一

添加

无级联:只要两方都有数据存在,就能添加,但是要注意,联合唯一

级联:相同

删除

无级联:有关系的不能删除相关的表,但是能够删除关系表的记录

级联:会删除中间表有关系的记录

修改

无级联:关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)

级联:可以直接修改,中间的联系表的内容

  1. id int primary key auto_increment,
  2. # 关系表一定有多个外键,关联着多张表
  3. # 关联学生表
  4. student_id int,
  5. foreign key(student_id) references student(id)
  6. on update cascade
  7. on delete cascade,
  8. # 关联课程表
  9. course_id int,
  10. foreign key(course_id) references course(id)
  11. on update cascade
  12. on delete cascade,
  13. # 建立两个字段的联合唯一
  14. unique(student_id, course_id)

多表关系

  1. """
  2. 一对一:丈夫-妻子,用户-身份证,作者-作者详情
  3. 一对多:部门-员工,班级-学生,书-出版社
  4. 多对多:老师-班级,课程-学生,出版社-作者
  5. """
  6. # 书 - 出版社 - 作者 - 作者详情 外键分布
  7. # 外键是 建立表与表关联 的字段,通常 一个表的外键 是 另一个表的主键(唯一键也可以)
  8. # 一对一:外键在任何一方都可以,此时外键要设置 唯一键
  9. """
  10. 作者(author):id,name,sex,age,mobile
  11. 作者详情(author_detail): id,info,address,author_id
  12. ----------------------------------------------------
  13. 作者(author):id,name,sex,age,mobile, detail_id
  14. 1 Tom 1
  15. 2 Bom 2
  16. 3 Bob 3
  17. 作者详情(author_detail): id,info,address
  18. 1 Tom_info
  19. 2 Bom_info
  20. """
  21. # 一对多:外键必须放在多的一方,此时外键值不唯一
  22. """
  23. 书(book):id,name,price,publish_id
  24. 1 西游记 1
  25. 2 东游记 2
  26. 3 西厢记 1
  27. 4 流浪记 1
  28. 出版社(publish): id,name,address,phone
  29. 1 老奶奶出版社
  30. 2 小奶奶出版社
  31. """
  32. # 多对多:一定要创建第三张表(关系表),每一个外键值不唯一,看可以多个外键建立联合唯一
  33. """
  34. 作者(author):id, name, age
  35. 出版社(publish):id, name, address
  36. 作者与出版社关系表:id, author_id, publish_id
  37. id author_id publish_id
  38. 1 1 1
  39. 2 1 2
  40. 3 2 1
  41. 4 2 2
  42. """

外键

  1. # 作者(author):id,name,sex,age,mobile, detail_id
  2. # 作者详情(author_detail): id,info,address
  3. # 1、外键的 字段名 可以自定义(名字随意),通常命名规范(关联表_关联字段)
  4. # 2、外键要通过 foreign key 语法建立表与表之间的关联
  5. # 3、foreign key(所在表的外键字段) references 关联表(关联字段)
  6. # eg:foreign key(detail_id) references author_detail(id)
  7. # 4、级联关系
  8. # 级联更新 on update cascade
  9. # 级联删除 on delete cascade
  10. # 重点:外键字段本身可以唯一或不唯一,但是外键关联的字段一定唯一

一对一:无级联关系

  1. # 作者详情(author_detail): id,info,address
  2. create table author_detail(
  3. id int primary key auto_increment,
  4. info varchar(256),
  5. address varchar(256)
  6. );
  7. # 作者表id,name,sex,age,mobile, detail_id
  8. create table author(
  9. id int primary key auto_increment,
  10. name varchar(64) not null,
  11. mobile char(11) unique not null,
  12. sex enum('男', '女') default '男',
  13. age int default 0,
  14. detail_id int unique not null,
  15. foreign key(detail_id) references author_detail(id)
  16. );
  17. # 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据
  18. mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');
  19. mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);
  20. mysql>: insert into author_detail(info,address) values('Bob_info','Bob_address');
  21. mysql>: insert into author(name,mobile,detail_id) values('Bob','15666882233', 2);
  22. # 修改关联表 author
  23. mysql>: insert into author_detail(info,address) values('Tom_info_sup','Tom_address_sup');
  24. mysql>: update author set detail_id=3 where detail_id=2; # 有未被其他数据关联的数据,就可以修改
  25. # 删除关联表 author
  26. mysql>: delete from author where detail_id=3; # 直接删除
  27. # 修改被关联表 author_detail
  28. mysql>: update author_detail set id=10 where id=1; # 无法修改
  29. # 删除被关联表 author_detail
  30. mysql>: delete from author_detail where id=1; # 无法删除
  31. # 没有级联关系下:
  32. # 增加:先增加被关联表记录,再增加关联表记录
  33. # 删除:先删除关联表记录,再删除被关联表记录
  34. # 更新:关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)

一对一:有级联关系

  1. mysql>: drop table author;
  2. mysql>: drop table author_detail;
  3. # 作者详情(author_detail): id,info,address
  4. create table author_detail(
  5. id int primary key auto_increment,
  6. info varchar(256),
  7. address varchar(256)
  8. );
  9. # 作者表id,name,sex,age,mobile, detail_id
  10. create table author(
  11. id int primary key auto_increment,
  12. name varchar(64) not null,
  13. mobile char(11) unique not null,
  14. sex enum('男', '女') default '男',
  15. age int default 0,
  16. detail_id int unique not null,
  17. foreign key(detail_id) references author_detail(id)
  18. on update cascade
  19. on delete cascade
  20. );
  21. # 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据
  22. mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1); # 错误
  23. mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');
  24. mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);
  25. mysql>: insert into author_detail(info,address) values('Bob_info','Bob_address');
  26. mysql>: insert into author(name,mobile,detail_id) values('Bob','15666882233', 2);
  27. # 修改关联表 author
  28. mysql>: update author set detail_id=3 where detail_id=2; # 失败,3详情不存在
  29. mysql>: update author set detail_id=1 where detail_id=2; # 失败,1详情已被关联
  30. mysql>: insert into author_detail(info,address) values('Tom_info_sup','Tom_address_sup');
  31. mysql>: update author set detail_id=3 where detail_id=2; # 有未被其他数据关联的数据,就可以修改
  32. # 删除关联表 author
  33. mysql>: delete from author where detail_id=3; # 直接删除
  34. # 修改被关联表 author_detail
  35. mysql>: update author_detail set id=10 where id=1; # 级联修改,同步关系关联表外键
  36. # 删除被关联表 author_detail
  37. mysql>: delete from author where detail_id=10; # 可以删除对被关联表无影响
  38. mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 10);
  39. mysql>: delete from author_detail where id=10; # 可以删除,将关联表的记录级联删除掉

一对多

  1. # 一对多:外键必须放在多的一方,此时外键值不唯一
  2. # 出版社(publish): id,name,address,phone
  3. create table publish(
  4. id int primary key auto_increment,
  5. name varchar(64),
  6. address varchar(256),
  7. phone char(20)
  8. );
  9. # 书(book):id,name,price,publish_id, author_id
  10. create table book(
  11. id int primary key auto_increment,
  12. name varchar(64) not null,
  13. price decimal(5, 2) default 0,
  14. publish_id int, # 一对多的外键不能设置唯一
  15. foreign key(publish_id) references publish(id)
  16. on update cascade
  17. on delete cascade
  18. );
  19. # 增:先增加被关联表(publish)的数据,再增加关联表(book)的数据
  20. mysql>: insert into publish(name, address, phone) values
  21. ('人民出版社', '北京', '010-110'),
  22. ('西交大出版社', '西安', '010-119'),
  23. ('老男孩出版社', '上海', '010-120');
  24. mysql>: insert into book(name, price, publish_id) values
  25. ('西游记', 6.66, 1),
  26. ('东游记', 8.66, 1),
  27. ('python从入门到入土', 2.66, 2),
  28. ('轮程序员修养之道', 3.66, 3),
  29. ('好好活着', 88.88, 3);
  30. # 没有被关联的字段,插入依旧错误
  31. mysql>: insert into book(name, price, publish_id) values ('打脸之道', 0.3, 4); # 失败
  32. # 更新:直接更新被关联表的(publish) 主键,关联表(book) 外键 会级联更新
  33. mysql>: update publish set id=10 where id=1;
  34. # 更新:直接更新关联表的(book) 外键,修改的值对应被关联表(publish) 主键 如果存在,可以更新成功,反之失败
  35. mysql>: update book set publish_id=2 where id=4; # 成功
  36. mysql>: update book set publish_id=1 where id=4; # 失败
  37. # 删:
  38. # 删被关联表,关联表会被级联删除
  39. mysql>: delete from publish where id = 2;
  40. # 删关联表,被关联表不会发生变化
  41. mysql>: delete from book where publish_id = 3;
  1. # 假设:书与作者也是 一对多 关系,一个作者可以出版多本书
  2. create table book(
  3. id int primary key auto_increment,
  4. name varchar(64) not null,
  5. price decimal(5, 2) default 0,
  6. publish_id int, # 一对多的外键不能设置唯一
  7. foreign key(publish_id) references publish(id)
  8. on update cascade
  9. on delete cascade
  10. # 建立与作者 一对多 的外键关联
  11. author_id int,
  12. foreign key(author_id) references author(id)
  13. on update cascade
  14. on delete cascade
  15. );

多对多

  1. # 多对多:一定要创建第三张表(关系表),每一个外键值不唯一,看可以多个外键建立联合唯一
  2. mysql>: drop table author;
  3. mysql>: drop table author_detail;
  4. mysql>: drop table book;
  5. mysql>: drop table publish;
  6. # 作者(author):id, name, age
  7. create table author(
  8. id int primary key auto_increment,
  9. name varchar(64),
  10. age int unsigned default 0
  11. );
  12. # 出版社(publish):id, name, address
  13. create table publish(
  14. id int primary key auto_increment,
  15. name varchar(64),
  16. address varchar(256)
  17. );
  18. # 作者与出版社关系表:id, author_id, publish_id
  19. create table author_publish(
  20. id int primary key auto_increment,
  21. # 关系表一定有多个外键,关联着多张表
  22. # 关联作者表
  23. author_id int,
  24. foreign key(author_id) references author(id)
  25. on update cascade
  26. on delete cascade,
  27. # 关联出版社表
  28. publish_id int,
  29. foreign key(publish_id) references publish(id)
  30. on update cascade
  31. on delete cascade,
  32. # 建立两个字段的联合唯一
  33. unique(author_id, publish_id)
  34. );
  35. # 注:关系表 关联着 作者 和 出版社 两张表,在表结构上 作者 与 出版社 两表键没有任何关系
  36. # 增:两张被关联表,没有前后关系,但关系表必须在两个表都提供数据后才能进行 关系匹配
  37. mysql>: insert into author(name, age) values('ruakei', 67),('engo', 76),('Lxx', 3);
  38. mysql>: insert into publish(name, address) values('老男孩出版社', '上海'),('小女孩出版社', '北京');
  39. # 操作关系表:
  40. mysql>: insert into author_publish(author_id, publish_id) values(1,1),(1,2),(2,1),(2,2),(3,1);
  41. # 关系表操作:增、删、改,只要两张被关系表有提供对应的操作数据,都可以操作成功,且对两张被关系表没有影响
  42. # 操作两张被关系表:
  43. # 增:不会影响关系表
  44. mysql>: insert into publish(name, address) values('西交大出版社', '西安');
  45. # 改:关系表都会级联更新
  46. mysql>: update publish set id=10 where id=1;
  47. # 删:关系表都会级联删除
  48. mysql>: delete from author where name='ruakei';

Mysql多表关系的更多相关文章

  1. MySQL之表关系

    MySQL表关系 一对多关系 一对多与多对一是一个概念,指的是一个实体的某个数据与另外一个实体的多个数据有关联关系. 举例,学校中一个学.院可以有很多的学生,而一个学生只属于某一个学院(通常情况下), ...

  2. MySql 多表关系

    多表关系 一对一关系 一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里面 一对多关系 班级是1端,学生是多端,结合面向对象的思想 ...

  3. mysql管理表关系

    表关系管理 关注公众号"轻松学编程"了解更多. 1.概述 ​ 表与表之间的关系可以是一对一.一对多.多对一的.通过外键把表连接起来,外键放在任意一张表都可以,通常选择由从表(相对次 ...

  4. MySQL约束条件 表关系建立 查询数据

    约束条件 unsigned 无符号 即为非负数,用此类型可以增加数据长度 例如 tinyint最大范围是127,那tinyint unsigned 最大就可以到 127 * 2 通常用在不会出现符号的 ...

  5. MySQL之表关系与范式

    关系: 所有的关系都是指表与表之间的关系. 将实体与实体的关系,反应到最终数据库表的设计上来,可以将关系分成三种:一对一,一对多(多对一)和多对多. 一对一: 一张表的一条记录一定只能与另外一张表的记 ...

  6. 库增删该查,表增删该查,记录增删该查,表与表关系(多对多,多对一,一对一),mysql用户管理

    库增删该查 增加库 create database db1 create database db1 charset="gbk 查看库 show databases 查看所有库 show cr ...

  7. MySQL开发——【多表关系、引擎、外键、三范式】

    多表关系 一对一关系 一对多或多对一关系 多对多关系 MySQL引擎 所谓的MySQL引擎就是数据的存储方式,常用的数据库引擎有以下几种: Myisam与InnoDB引擎之间的区别(面试) ①批量插入 ...

  8. MySQL数据库篇之完整性约束和表关系

    主要内容: 一.完整性约束 二.表关系 1️⃣ 完整性约束 (1)何为完整性约束? 约束条件与数据类型的宽度一样,都是可选参数. 作用:用于保证数据的完整性和一致性 (2)分类主要有以下五类: 1.n ...

  9. mysql数据库之表关系

    外键 前戏之一对多关系 # 定义一张部门员工表id name gender dep_name dep_desc1 jason male 教学部 教书育人2 egon male 外交部 漂泊游荡3 ta ...

随机推荐

  1. 全排列函数(next_permutation())

    平常需要全排列的时候,一般都是dfs然后字符串匹配啥的……今天看题解的时候突然发现了这个神器. next_permutation()函数在c++的algorithm库里,作用是传入一个数组,输出这个数 ...

  2. 一道国外前端面试题引发的Coding...

    刚刚看到CSDN微信公众号一篇文章,关于国外程序员面试前端遇到的一道测试题,有点意思,遂写了下代码,并记录一下~ 题目是这样的: ['Tokyo', 'London', 'Rome', 'Donlon ...

  3. Weed:线段树

    观察复杂度,是log级别以下回答询问的. O(1)?逗我kx呢? 自然而然地想到线段树. 学长讲的原题啊考场上还不会打. 线段树上的每个节点都表示一个操作区间. 线段树上维护的权值有3个:这个子区间一 ...

  4. NOIP模拟27

    两个机房又和在一起考试 开场看了看T1,感觉挺水的,过. T2,这个式子有点奇怪,暂时没什么思路,过 T3,好像保留最后几位换个根处理一下就行了,过,先去打T1 于是T1大概打了0.5h,连暴力带正解 ...

  5. 物理CPU数、CPU核心数、进程数

    参考CSDN博客:https://blog.csdn.net/helloworld0906/article/details/90547159 一. 物理cpu数.cpu核数.线程数(逻辑cpu数)的关 ...

  6. ftp工具无法连接到Linux服务器

    ftp工具无法连接Linux服务器,文件无法上传,是因为你的ftp服务器未搭建(或未启动) 许久没有登录腾讯云,今天想用xshell的xftp工具上传文件,却突然出现连接不上. 用22端口,可以正常登 ...

  7. m96-97 lsc nc赛

    这一次 lsc 再一次一道题都没AC,看来lsc已经凉了! 出了分,旁边的_LH大喊了一声 “woc,lsc,你真是太垃圾!”...........“好吧!” 我确实很垃圾!(大佬这次都没考,所以我更 ...

  8. Vue基础系列(三)——Vue模板中的数据绑定语法

    写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. VUE基础系列目录 < ...

  9. Java-100天知识进阶-基本类型-知识铺(一)

    知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停地来唤醒你记忆深处的知识点. Java的两大数据类型: 一.内置数据类型 二.引用数据类型 内置数据类型 Java语 ...

  10. map集合中哪些是线程安全的

    为什么HashMap是线程不安全的 总说 HashMap 是线程不安全的,不安全的,不安全的,那么到底为什么它是线程不安全的呢?要回答这个问题就要先来简单了解一下 HashMap 源码中的使用的存储结 ...