数据库之一对一,一对多,多对多

一对多关系的处理:

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);


多对多的处理:
添加中间表,添加两个外键,分别关联不同的主表
为了保证数据不重复,需要给啷个外键添加联合唯一约束

 

posted @ 2019-03-15 19:02  -Rye-  阅读(734)  评论(0)    收藏  举报