mysql数据库:分表、多表关联、外键约束、级联操作

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

二、多对多

三、一对一

 

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

将部门数据与员工数据放到同一张表中会造成
    数据重复
    结构混乱
    扩展维护性差
    需要分表


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),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(20),
d_id int,
foreign key(d_id) references dept(id)
on delete cascade
on update cascade
);

on delete cascade 当主表删除记录时 从表相关联的记录同步删除
on update cascade 当主表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,"仨疯");
# 插入对应关系
insert into tsr values
(null,1,1),
(null,1,2),
(null,2,2);
 
如何知道  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 五万

转载于:https://www.cnblogs.com/wuzhengzheng/p/10273461.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值