表关联关系,表的复制

分表:
到底是一对多还是多对1要看从那个角度出发
分表后需要为表添加关联关系
在老师表中的部门编号为1,但是1号部门根本不存在,所以该数据不是一条完整的数据
需要通过外键约束,来保证数据只要插入就是完整的数据




create table dept(id int primary key auto_increment,
name char(10),
job char(30));


create table teacher(
id int primary key auto_increment,
name char(20),
gender char(10),
dept_id int,
foreign key(dept_id)references dept(id)
);

insert into dept values(null,'教育部','教学生');

insert into teacher values(null,'老杨','man',1)

 



在老师表中的部门编号为1 但是1号部门根本不存在 所以该数据不是一条完整数据 需要通过外键约束 来保证数据只能插入 一定是完整的数据
如果要将两张表用外键关联起来 一定要区分表的主从关系
主表:部门表
从表:老师表
一定要先建主表 在创建从表

添加外键约束的语法
create table 表名称(
一堆字段...,
foreign key(要设置为外键的字段)references 主表名称(主表字段)
)

案例:
#部门表
id int primary key auto_increment,
name char(10),
job char(30));

#老师表
create table teacher(
id int primary key auto_increment,
name char(20),
gender char(10),
dept_id int,
foreign key(dept_id)references dept(id));

 




总结外键的作用:
当我们把数据分到不同表之后 相互就没有任何联系了,
如何才能保证数据完整,需要使用外键约束

外键约束的原理:
让从表的某个字段 参照主表的一个字段(通常是主键 主键是唯一不重复的)
一旦外键关系建立之后,就会产生一系列的约束行为
1.要先创建主表 在创建从表
2.从表插入数据时 必须保证外键的值已经存在外键于主表中
3.删除表时 要先删除从表 再删除主表
4.当要删除主表中的记录时 要保证从表中没有记录
5.主表更新时 如果要更新主键 必须保证从表中没有记录参照这一记录

create table 名称(一堆字段,
foreign key(外键字段) references 主表名(主键字段);

从表中外键字段通常是int类型 通常外键都要参照对方的主键

外键是一种约束 是为了保证数据完整性
外键就是另一个表的主键
外键用于建立物理层级的关联关系

在正常开发中不推荐使用? 会降低存取效率
所以一般会把关系的维护交给应用程序 就是逻辑层面的关系

外键可以解决
多对一的关联关系
一个部门对应多个员工 1 V n
多个员工对应一个部门 n V 1
上述关系成立 那么一定是多对一
在从表中增加一个字段用于关联主表的主键

存在外键关系后 增删改 都收到了各种限制 操作起来较麻烦
mysql提供了一个级联操作
指的是 当主表发生改变 会同步操作从表
级联更新 主表更新了主键时,从表会相应的更新外键的值
级联删除 主表删除某一条记录 从表只要外键与被删除的记录主键值相同 则全部删除

# 员工表   id name gender dept_id
# 部门表  id  name

create table dept(id int primary key auto_increment,name char(20));
create table emp(id int primary key auto_increment,name char(20),gender char(10),dept_id int,foreign key(dept_id) references dept(id));


设置级联的语法 在外键后面+on delete cascade和onupdate cascade 可以同时出现也可以单独使用
create table emp(id int primary key auto_increment,name char(20),gender char(10),dept_id int,
foreign key(dept_id) references dept(id) on delete cascade on update cascade
);

 





一对一关系的处理

案例:
客户表
create table customer(id int primary key auto_increment,
name char(20),
phone char(20),
addr char(50));

insert into customer values(null,"渣渣辉","119","苏州");
insert into customer values(null,"陈凯歌","120","北京");

学员表
create table student(id int primary key auto_increment,
name char(20),
class char(20),
subject char(20),
foreign key(id) references customer(id));

insert into customer values(1,"渣渣辉","py6","python");
insert into customer values(2,"陈凯歌","py6","python");

 


一对一 关系 不需要增加字段 直接把从表的主键设置为外键即可
通常一对一关系 是用来垂直分表的


多对多的关系

案例:
学生表
create table student(id int primary key auto_increment,
name char(20),
gender char(20));


老师表
create table teacher(id int primary key auto_increment,
name char(20),
gender char(20),
subject char(29));


关系表
 create table t_s_r(id int primary key auto_increment,
 s_id int not null,t_id int not null,
 foreign key(s_id) references student(id),
 foreign key(t_id) references teacher(id),
 unique(s_id,t_id)
 );


#需要先添加数据到 两个主表 学生和老师
insert into teacher values(1,"渣渣辉","man","python");
insert into teacher values(2,"陈凯歌","man","python");

insert into student values(1,"小明","man");
insert into student values(2,"小红","woman");


# 添加关系 数据
渣渣辉 教过 小明
insert into t_s_r values(null,1,1);

多对多的处理:
添加中间表 添加两个外键 分别关联不同的主表
为了保证数据不重复 需要给两个外键添加 联合唯一约束
posted @ 2019-03-15 17:09  777ijBGly-  阅读(301)  评论(0编辑  收藏  举报