为什么建立分表
只使用一个表的话:
1.重复数据,浪费空间
2.数据结构混乱
3.扩展性差
当一条记录中的数据 不属于同一类时
分表之后,几个表之间存在内在的关系,就需要联合在一起,就会存在:多对多,一对多,一对一的关系。
必须找到一种方法,可以在物理层面建立关联关系
一对多的关系的实例
员工与部门的关系,一个部门可以有多个员工。员工只有一个部门。
#先建立主表,主表指的是没有外键的表
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更新时 从表相关联的记录同步更新
注意是单向的 主表变化是 级联操作从表 从表的变化不会级联到主表