一对多关系的处理:
create table teacher(
id int primary key auto_increment,
name char(20),
gender char(10),
dept_id int);
create table dept(
id int primary key auto_increment,
name char(20),
job char(30));
问题:
insert into teacher values(null,"Trish","woman",1);
在老师表中的部门编号为1,但是1号部门根本不存在,所以该数据不是一条完整数据
需要通过外键约束来保证数据只要能插入就一定是完整的数据
强调:
如果要将两张表用外键关联起来,一定要区分表的主从关系
主表:部门表
从表:教师表
一定要先创建主表,再创建从表
语法:
添加挖减约束的语法
create table 表名称(
一堆字段...,
foreign key(要设置为外键的字段) references 主表名称(主键字段))
案例:
部门表
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));
总结外键的作用:
当我们把数据分到不同表中之后,相互就没有任何联系,
如何才能保证数据完整,这就需要使用到外键约束了
外键约束的原理:
让从表的某个字段参照主表的一个字段(通常是主键,主键是唯一的)
一旦外键关系建立之后,就会产生一系列约束行为
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 和 on update 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,"Trish","110","Devil Never Cry");
insert into customer values(null,"Lady","120","Devil May Cry");
学员表
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."Trish","py6","python");
insert into customer values(2."Lady","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(20));
关系表
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."Trish","woman","python");
insert into teacher values(2."Lady","woman","python");
insert into student values(1."Dante","man");
insert into student values(2."Nero","man");
添加关系 数据
Trish教过Dante
insert into t_s_r values(null,1,1);
多对多的处理:
添加中间表,添加两个外键,分别关联不同的主表
为了保证数据不重复,需要给啷个外键添加联合唯一约束