本文目录:

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

二、多对多

三、一对一

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

分表

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

外键

以上代码 可以建立关联关系 但是这个关系是逻辑上的 不实际存在
需要为他建立物理上的关联
通过外键 约束 create table 表名(字段名 类型(长度),foreign key(外键的字段名称) references 对方表名(对方主键名)); 使用外键时 必须分清 主从关系 外键的第一种约束
先建主表
再建从表
create table dept(id int primary key auto_increment,name char(20),job char(20));
create table emp(id int primary key auto_increment,name char(20),d_id int,foreign key(d_id) references dept(id)); 外键的第二个约束
先插入主表
再插入从表 外键的第三个约束
删除记录时
先删除从表记录
再删主表记录 外键的第四个约束
从表更新外键时 必须保证外键是存在的 外键的第五个约束
更新主表的id时
必须先删除从表关联的数据
或者把关联数据 关联其他的主表id 外键的第六个约束
删除主表时 要先删除从表

级联操作

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

一对多

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

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

刚才的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. Linux学习—yum命令(转载)

    yum简介 yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 基於RPM包管理,能够从指定的服务器自动 ...

  2. 短路与(&&)、短路或(||)

    昨晚上课,老师用了类似这样的语法 fn&&fn.call(obj) fn&&fn.call(obj)  这里的fn为回调函数.老师在课上也没过多解释这句是啥意思,然后我 ...

  3. python入门踩坑

    问题1:ImportError: No module named requests 解决:一般报这种错误就是目前还没有这个方法的类库,需要下载或在升级类库.打开cmd命令,输入python -m pi ...

  4. Mybatis batch 批量处理

    @Testpublic void batch() throws IOException { InputStream inputStream= Resources.getResourceAsStream ...

  5. Int8,Int16,Int32,Int64 有啥不同呢?看了立马就懂!

    大家有没有写了很久代码,还不知道这个Int8,Int16, Int32, Int64有什么区别呢?或者是为什么后面的数字不一样呢? 初步了解了一下,才清楚这个东西. 先来扫盲一下计算机存储单元, 在计 ...

  6. 50道Kafka面试题和解析(转载)

    转载:https://zhuanlan.zhihu.com/p/78912551 前言 Apache Kafka的受欢迎程度很高,Kafka拥有充足的就业机会和职业前景.此外,在这个时代拥有kafka ...

  7. MySQL_数据类型

    目录 整型 浮点型 定点数类型 日期时间型 字符型 M为最大值,D为精度值 整型 数据类型 存储范围 字节 tinyint 有符号值:-128到127(-27到27-1) 无符号值:0到255(0到2 ...

  8. SpringMvc的基础配置<一>

    SpringMVC学习 1.此篇博文是学习以下博文,并通过亲测得来:   1.1.网址:http://www.cnblogs.com/bigdataZJ/p/springmvc1.html 2.所用软 ...

  9. vultr 更换服务器

    今天打算去p站看看电影 结果发现自己的vps被封了......记录一下换服务器的过程 首先去 https://www.17ce.com/ ping一下,发现只有国外的服务器能ping通 果然是被封了. ...

  10. [转帖]socks5 协议简介

    socks5 协议简介 http://zhihan.me/network/2017/09/24/socks5-protocol/ 什么是socks5 或许你没听说过socks5,但你一定听说过Shad ...