多表关联

为什么建立分表

只使用一个表的话:

  1.重复数据,浪费空间

  2.数据结构混乱

  3.扩展性差

什么时候分表

  当出现大量重复数据时

  当一条记录中的数据 不属于同一类时

 

分表之后,几个表之间存在内在的关系,就需要联合在一起,就会存在:多对多,一对多,一对一的关系。

必须找到一种方法,可以在物理层面建立关联关系

  解决方案:外键约束

外键约束的具有的约束

第一种约束:先建主表,再建从表

第二种约束:先插入主表,插入从表

第三种约束:先删从表记录,再删主表记录

第四种约束:从表更新外键,必须保证外键存在

第五种约束:更新主表的id时,必须先删除从表关联数据

第六中约束:删除主表,要先删除从表。

有了这几个约束后,主表和从表中的数据必然是完整的

一对多的关系的实例

员工与部门的关系,一个部门可以有多个员工。员工只有一个部门。

 

#先建立主表,主表指的是没有外键的表

create table dpt(id int primary key auto_increment,name char(10));

 

#部门表没有外键,员工表有外键

-> create table emp (id int primary key auto_increment,name char(10),dpt_id int,
-> foreign key (dpt_id) references dpt(id));

mysql> #数据插入先主表,后从表
-> insert into dpt values (null,"市场部"),(null,"人事部");

mysql> insert into emp(name,dpt_id) values ("张三丰",1),("扫地僧",2),('张无忌',1),("虚竹",2);

#插入从表的数据的外键必须是主表有的才可以插入

对于一对多的关系,建立联系,需要确定其中主表,与从表。主表再逻辑上是先于从表的数据生成的。

 

多对多的关系的实例

多对多的关系,是建立一张从表,将学生表和老师表作为主表,关系表作为从表。

 

create table teacher (id int primary key auto_increment,name char(10),salary int,course char(10));

create table student (id int primary key auto_increment,name char(10));

mysql> create table tsr (id int primary key auto_increment,tid int,sid int,
-> foreign key (tid) references teacher(id),
-> foreign key (sid) references student(id));

insert into teacher(name,salary,course) values ("egon",30000,"python"),("hu",20000,"python");

insert into student(name) values ("msj"),("lyh");

 insert into tsr(tid,sid) values (1,1),(1,2),(2,1),(2,2);

一对一的关系实例

常用信息与详细信息之间的关系就是一对一,一对一除了外键需要添加,还需要添加唯一性表示符。

 create table basic_info (id int primary key auto_increment,name char(10),gender enum("m","w"),age int);

create table det_info (id int primary key auto_increment,height int,weight int,b_id int unique,
-> foreign key (b_id) references basic_info(id));

insert into basic_info values(null,"杨元虎","m",18)

insert into det_info values (null,180,75,1);

级联约束

对于主表数据的操作可能影响到从表的数据(从表的外键与主表的主键紧密关联),所以外键约束对主表的删除和修改都会严格要求。

一般来说想要删除主表中一条数据,需要将从表中的相关的数据全部删除或修改,才能正确删除。

这是就有了级联约束。

设置 on delete cascade

  on update cascade

on delete cascade 当主表删除记录时 从表相关联的记录同步删除
on update cascade 当主表id更新时 从表相关联的记录同步更新
注意是单向的 主表变化是 级联操作从表 从表的变化不会级联到主表

 

 

 

 

 

posted @ 2018-11-21 16:32  msjaxuexi  阅读(416)  评论(0编辑  收藏  举报