关联关系:mysql是一个关系型数据库,不仅可以存储数据,还可以维护数据与数据之间的关系,通过在数据表中建立外键约束
数据之间的关联关系有四种:一对一关联,一对多,多对一,多对多
一对一关联
方案一,通过主键关联--两张数据表中主键相同的数据为相互对应的数据
方案二,唯一外键--在任意一张表中添加一个字段添加外键约束与另一张表主键关联,并且将外键列添加唯一约束
一对多与多对一
多对多关联
方案:额外创建一张关系表来维护多对多关联---在关系表中定义两个外键,分别于两个胡数据表的主键进行关联
外键约束---将一个列添加外键约束,与另一张表的主键(唯一列)进行关联之后,外键约束的列添加的数据,必须要在主键关联的字段中
1,创建班级表
create table class(
id int primary key auto_increment,
name varchar(30) not null unique,
remark varchar(200)
);
2,创建学生表(在学生表中添加外键与班级表的主键进行关联)
方案一
在创建表时,定义cid字段,并添加外键约束
由于cid列要与classes列表中的id进行关联,因此cid字段类型长度要与id一致
create table students(
num char(8) primary key,
name varchar(30) not null,
gender char(2) not null,
age int not null,
cid int,
constraint FK_STUDENTS_CLASS foreign key(cid) references class(id)
);
方案二:先创建表,再添加外键约束
create table students(
num char(8) primary key,
name varchar(30) not null,
gender char(2) not null,
age int not null,
cid int);
在创建表之后,为cid添加外键约束
alter table students add constraint FK_STUDENTS_CLASS foreign key(cid) references class(id);
删除外键约束
alter table students drop foreign key FK_STUDENTS_CLASS;
3,向班级表添加信息
当学生表中存在学生信息关联班级表的某条记录时,就不能对班级表的这条记录进行修改和删除操作
如果一定要修改java3的班级ID,该如何实现?
1,将引用Java3班级id的学生的cid修改为null;
2,再修改班级信息表中javav3记录的id;
3,将学生表中cid设置为null的记录的cid重新修改为java3这个班级的新的id.
级联删除
1,在创建外键时,设置级联修改和级联删除
删除原有的外键约束
alter table students drop foreign key FK_STUDENTS_CLASS;
重新添加外键约束,并且设置级联修改和级联删除
mysql> alter table students add constraint FK_STUDENTS_CLASS foreign key(cid) references class(id) ON UPDATE CASCADE ON DELETE CASCADE;
2,测试级联修改
班级信息 学生信息
直接修改java3的id关联java3这个班级的学生记录的cid也会同步修改
3,测试级联删除
删除id=1的班级信息,学生表中引用此班级信息的记录也会被同步删除
delete from class where id = 1;