分表:
到底是一对多还是多对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);
多对多的处理:
添加中间表 添加两个外键 分别关联不同的主表
为了保证数据不重复 需要给两个外键添加 联合唯一约束