mysql关联关系

5.2操作关联表

⚠️重点内容可直接往下翻看案例操作

5.2.1 关联关系

在开发中,需要根据实体的内容设计数据表,实体间会有各种关联关系,所以,根据实体设计的数据表之间,也存在着各种关联关系。 
MySQL中,数据表的关联关系分为三种。

1、多对1

多对一是数据表中,最常见的一种关系 
比如,员工和部门之间的关系,一个部门可以有多个员工,但是,一个员工从属于一个部门,部门表中的一行在员工表中,可以有许多匹配行,但是,员工表中的一行,在部门表中只能有一个匹配行。

建立外键,在多对一的表关系中,应该将外键建在多的一方,否则,会造成数据冗余。

2、 多对多

多对多也是数据表中的一种关系 
比如,学生与课程之间的关系,一个学生可以选择多门课程,一门课程可以供多个学生选择,学生表中的一行,在课程表中可以有许多匹配行,课程表中的一行,在学生表中也有许多匹配行。

3、 一对一

一对一关系,在实际生活中比较常见 
比如,人与身份证之间,就是一对一的关系,一个人对应一张身份证,一张身份证只能匹配一个人。那么一对一的关系如何建立外键?首先,要分清主从关系,从表需要主表的存在才有意义,身份证需要人的存在,才有意义,因此,人为主表,身份证为从表,要在身份证中建立外键。

注意,这种方法关系在数据库中并不常见,因为,这种方式存储的信息通常会放在一个表中。 
在实际开发中,一对一关联关系,可以应用于以下几个方面 
1、分割具有很多列的表 
2、由于安全原因,而隔离表的一部分 
3、保存临时的数据,并且,可以毫不费力的通过删除该表,而删除这些数据。

5.2.2 添加数据

在开发中,最常见的关联关系就是多对一关系。接下来,为表student和表grade中添加外键约束来建立两个表的关联关系。具体语句如下:

#为表student和表grade中添加外键约束来建立两个表的关联关系

alter table student add constraint FK_ID foreign key(gid) REFERENCES grade (id);

#语句执行成功后,查看外键约束是否成功添加

SHOW CREATE TABLE student;

从查询结果可以看出,student表的外键约束已经成功添加。此时表student和表grade之间是多对一的关系。因为外键列只能插入参考列存在的值,所以如果要为两个表添加数据,就需要先为主表grade添加数据。具体语句如下:

#添加数据

INSERT INTO grade(id,name)VALUES(1,'软件一班');

INSERT INTO grade(id,name)VALUES(2,'软件二班');

在上述语句中,添加的主键id为1,2,由于student表的外键与grade表的主键关联,因此在为student表添加数据时,gid的值只能是1或者2,不能使用其他值,具体语句如下:

INSERT INTO student(sid,sname,gid)VALUES(1,'王红',1);

INSERT INTO student(sid,sname,gid)VALUES(2,'李强',1);

INSERT INTO student(sid,sname,gid)VALUES(3,'赵四',2);

INSERT INTO student(sid,sname,gid)VALUES(4,'郝娟',2);

上述语句执行成功后,两个表之间的数据就具有关联性。假如要查询软件一班有哪些学生,首先需要查询软件一班的id,然后根据这个id在student表中查询该班级有哪些学生,具体语句如下:

(1)在grade表中查询出班级名称为“软件一班”的id。

SELECT id FROM grade WHERE name='软件一班';

(2)在student表中,查询gid=1的学生,即为软件一班的学生。

SELECT sname FROM student WHERE gid=1;

5.2.3 删除数据

前面小节中讲解了如何为关联表添加数据,在某些情况下还需要删除关联表中的数据。

1、第一种:修改表数据:

外键虽然能够帮你强制建立表关系,但是也会给表之间增加数据相关的约束;改也不好改,删也不好删。删除的时候可以先删除把绑定关系表的数据,然后再删除被绑定关系表的数据。现在绑定关系表是student,被绑定关系表是grade;如果需要将班级表grade中1班解散,删除语句为:

(1) 将软件一班的所有学生全部删除

delete from student where sname='王红';

delete from student where sname='李强';

上述执行成功后,可以使用SELECT语句查询。

SELECT * FROM student where gid=1;

从上述语句可以看出,student表中已经没有任何学生记录。

(2) 在grade表中,将软件一班删除

delete from grade where id=1;

查询一下

SELECT * FROM grade;

但是这样修改太麻烦,当你要修改表中的某一条数据时,还要考虑先改哪张表再改哪张表。

2、第二种修改方式:

级联更新级联删除:就是你在建外键的时候可以告诉它,之后你在动外键数据的时候我们两者是同步的,

你怎么动我怎么动,你删一条数据,我也跟着删除一条数据;你变我也跟着你变。

级联更新级联删除建表:

create table student1

(sid int primary key,

sname varchar(20),

gid int not null,

foreign key(gid) references grade(id)

on UPDATE CASCADE #级联更新

on DELETE CASCADE #级联删除

);

INSERT INTO student1(sid,sname,gid)VALUES(1,'王红',1);

INSERT INTO student1(sid,sname,gid)VALUES(2,'李强',1);

INSERT INTO student1(sid,sname,gid)VALUES(3,'赵四',2);

INSERT INTO student1(sid,sname,gid)VALUES(4,'郝娟',2);

(1)在grade表中,将软件一班删除(级联删除外键表中相应数据)

delete from grade where id=1;

可以直接删除

Select * from student1;

(2)在grade表中,将软件二班编码修改为5

Update grade

set id=5

Where id=2;

Select * from student1;

 

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值