本文目录:

一、分表、外键、级联、一对多

二、多对多

三、一对一

一、分表、外键、级联、一对多

分表

  1. 将部门数据与员工数据放到同一张表中会造成
  2. 数据重复
  3. 结构混乱
  4. 扩展维护性差
  5. 需要分表
  6.  
  7. create table dept(id int primary key auto_increment,name char(),job char());
  8. create table emp(id int primary key auto_increment,name char(),gendr char,age int,salary float,d_id int);

外键

  1. 以上代码 可以建立关联关系 但是这个关系是逻辑上的 不实际存在
  2. 需要为他建立物理上的关联
  3. 通过外键 约束
  4.  
  5. create table 表名(字段名 类型(长度),foreign key(外键的字段名称) references 对方表名(对方主键名));
  6.  
  7. 使用外键时 必须分清 主从关系
  8.  
  9. 外键的第一种约束
  10. 先建主表
  11. 再建从表
  12. create table dept(id int primary key auto_increment,name char(20),job char(20));
  13. create table emp(id int primary key auto_increment,name char(20),d_id int,foreign key(d_id) references dept(id));
  14.  
  15. 外键的第二个约束
  16. 先插入主表
  17. 再插入从表
  18.  
  19. 外键的第三个约束
  20. 删除记录时
  21. 先删除从表记录
  22. 再删主表记录
  23.  
  24. 外键的第四个约束
  25. 从表更新外键时 必须保证外键是存在的
  26.  
  27. 外键的第五个约束
  28. 更新主表的id
  29. 必须先删除从表关联的数据
  30. 或者把关联数据 关联其他的主表id
  31.  
  32. 外键的第六个约束
  33. 删除主表时 要先删除从表
  34.  

级联操作

  1. 有了这几个约束后 主表和从表中的数据必然是完整的
  2. 相应的收到外键约束 主表的删除 更新操作受到限制
  3. 很多情况下 我们就是要删除一个部门 然而需要至少两条sql语句 麻烦
  4.  
  5. 可以使用级联
  6. create table emp(
  7. id int primary key auto_increment,
  8. name char(),
  9. d_id int,
  10. foreign key(d_id) references dept(id)
  11. on delete cascade
  12. on update cascade
  13. );
  14.  
  15. on delete cascade 当主表删除记录时 从表相关联的记录同步删除
  16. on update cascade 当主表id更新时 从表相关联的记录同步更新
  17. 注意是单向的 主表变化是 级联操作从表 从表的变化不会级联到主表

一对多

一个场景中对应多个对象,想想生活中有哪些例子:一个年级可以有多个班级,古代一个官人可以有多个老婆,一条线可以有多辆公交车等等;

为了区分一对多和多对一,统一口径都叫一对多;即多个班级对应一个班级;

刚才的ehr库中的dept和emp表很好的说明一多的关系,即一个部门有多名员工,多个员工属于一个部门,但仔细想有没有这种情况存在,一个员工身兼数职,有啊!

但这种情况在公司里是少数,那我们举一个简单的公交系统案例:

车辆表中的线路ID外键关联线路表中的id

二、多对多

老师和学生
一个老师可以教多个学生
一个学生可以被多个老师教
老师表和学生表 是多对多的关系
需要一个中间表 专门存储关联关系
create table teacher(id int primary key auto_increment,name char(15));
create table student(id int primary key auto_increment,name char(15));
 
 
#中间表
create table tsr(
id int primary key auto_increment,
t_id int,s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id)
);
 
现在老师和学生 都是主表  关系表是从表
先插入老师和学生数据
insert into teacher values
(1,"水月先生"),
(2,"黄承彦");
insert into student values
(1,"诸葛亮"),
(2,"司马懿");
(3,"陆逊");
# 插入对应关系
insert into tsr values
(null,1,1),
(null,1,2),
(null,2,1);
(null,2,3);
 
 
 
如何知道  1号老师教过哪些学生

或者

如何知道1号被哪些老师教过
 

三、一对一

夫妻关系确实是一对一 但是在表中字段完全相同 没有必要分表
强行举例
客户 和 学生
一个客户只能产生一个学生
一个学生只能对应一个客户
这样的关系是一对一
使用外键来关联  但是需要给外键加上唯一约束
客户和学生有主从关系 需要先建立客户 再建学生
create table customer(c_id int primary key auto_increment,
name char(20),phonenum char(11),addr char(20));
create table student1(s_id int primary key auto_increment,
name char(20),
class char(11),
number char(20),
housenum char(20),c_id int UNIQUE,
foreign key(c_id) references customer(c_id)
);
一对一的另一种使用场景
当一个表这种字段太多 而常用字段不多时  可以采取垂直分表的方式来提高效率
原有的person表
拆分为
st_info
姓名 性别  年龄
details_info
身份证 地址 名族 身高 体重 血型 学历 政治面貌 联系方式
也有另一种提升效率的方式 水平分表
当一个表中数据记录太多时  效率会降低  可以采取水平分表  字段完全相同
stu  中有十万数据
    stu1 五万
    stu2 五万

mysql数据库:分表、多表关联、外键约束、级联操作的更多相关文章

  1. MySQL数据库 : 查询语句,连接查询及外键约束

    查询指定字段        select 字段1,字段2 from 表名; 消除重复行(重复指的是结果集中的所有完全重复行)             select distinct 字段1,字段2.. ...

  2. MySQL删除表的时候忽略外键约束

    删除表不是特别常用,特别是对于存在外键关联的表,删除更得小心.但是在开发过程中,发现Schema设计的有问题而且要删除现有的数据库中所有的表来重新创建也是常有的事情:另外在测试的时候,也有需要重新创建 ...

  3. SQL批量删除用户表(先删除所有外键约束,再删除所有表)

    --批量删除用户表 --1.删除外键约束DECLARE c1 cursor for     select 'alter table ['+ object_name(parent_obj) + '] d ...

  4. PHP.30-TP框架商城应用实例-后台6-商品会员价格删除-外键,级联操作

    商品会员价格删除 需求:当删除一件商品时,这件商品对应的会员价格也应该从会员价格表{price,level_id,goods_id}中删除掉. 有两种删除方法 1.在钩子函数_before_delet ...

  5. sql server 2008 外键的级联操作

    问题提出:现在我有三张表,学生Student,课程Course,成绩SC 1.  学生表Student,主键是学号Sno 2.  课程Course,主码是课程号Cno 3.  成绩SC,主码是Sno和 ...

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

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

  7. mysql 外键约束及表关联

    一.MYSQL中的约束 1.主键:primary key 唯一非空的特性并且可以优化查询速度 2.外键:foreign key 外键的作用保证2个或2个以上的数据表的数据一致性和完整性 3.唯一:un ...

  8. MySQL修改数据库、表、列、外键字符编码和排序编码

    在重启Confluence应用时,突然遇见这个检查错误,查询总结需要修改Mysql数据库的所有字符编码和排序编码,报错如下: Confluence Help – This installation o ...

  9. MySQL数据库(4)_MySQL数据库外键约束、表查询

    一.外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...

  10. MySQL删除所有表的外键约束、禁用外键约束

    转: MySQL删除所有表的外键约束.禁用外键约束 2017年10月27日 00:11:34 李阿飞 阅读数:4512   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

随机推荐

  1. 3年磨一剑,我的前端数据 mock 库 http-mock-middleware

    不好意思,离开博客园4年多了,一回来就是为自己打广告,真是害羞啊... http-mock-middleware 是我最近完成的一个前端数据 mock 库.它是我汇总近3年工作经验而诞生的一个工具,使 ...

  2. Spring Boot Lombok配置

    Spring Boot Lombok配置 依赖添加 dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.2' compi ...

  3. STS如何将一个文件夹设置缺省的创建路径(build path)

    STS中的build path是一种缺省的路径,相当于windows的环境变量中的path,利用它可以将jsp等文件放入其中,程序只需要文件名就可以找到它. (1)在Package Explorer中 ...

  4. android#ListView的简单用法

    新建项目,并修改项目生产的主文件activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/ap ...

  5. 【图像处理】H.264流媒体播放

    相信有不少人和我一样,希望实现H264格式视频的流媒体播放.但是对于一个新手来说,往往不知道从何入手.利用百度,GOOGLE等搜索资料真是沙里淘金.在琢磨了N周之后,才弄出来了点成果,其中费了很多无用 ...

  6. day31 socket套接字编程

    为什么要有套接字编程? 在上节课的学习中,我们学习了OSI七层协议,但是如果每次进行编程时我们都需要一层一层的将各种协议使用在我们的程序中,这样编写程序实在是太麻烦了,所以为了让程序的编写更加的简单, ...

  7. linux系统目录权限实践及结论

    总结测试结论:Linux目录的读.写.执行权限说明:

  8. Reactor系列(一)基本概念

    基本概念 视频讲解:https://www.bilibili.com/video/av78731069/ 关注公众号,坚持每天3分钟视频学习

  9. AirFlow功能展示个人笔记

    DAGs 查看您可以一目了然地查看成功.失败及当前正在运行的任务数量. 选中其中一个DAG 树视图 跨越时间的 DAG 的树表示.如果 pipeline(管道)延迟了,您可以很快地看到哪里出现了错误的 ...

  10. LEN()和DATALENGTH()的区别

    原文:LEN()和DATALENGTH()的区别 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.n ...