(10)外键、级联操作

一、概念
①外键:如果一个实体的(student:class_id)的某个字段,指向另一个实体(class:class_id)的主键,就称
student实体的class_id是外键。
②被指向的实体,称为主实体(主表),也叫父实体(父表)class
负责指向的实体,称置为从实体(从表),也叫子实体(子表)student

③作用:用于约束处于关系内的实体

④定义一个外键:
在从表上,增加一个外键组的那,指向主表的主键
使用关键字 foreign key

二、增加子表记录时,是否有与之相对应的父表记录。
drop table if exists class;
create table class(
class_id int primary key auto_increment,
class_name varchar(10) not null default ‘php’
)character set utf8;

drop table if exists student;
create table student(
stu_id int primary key auto_increment,
stu_name varchar(10) not null default ”,
class_id int ,
foreign key (class_id) references class (class_id)(注意外键的语法)
)character set utf8;

insert into student values(null,’小C’,1);//不能插入成功,这就是增加子表记录,没有与之相对应的父表记录,就不能插入子表数据

insert into class values(null,’php3301’);//增加主表中的记录
insert into student values(null,’小C’,1);//因为外键有相应的班级,所以可以插入成功

三、设置级联操作
在主表数据发生改变时,关联的从表数据应该如何处理
主表更新:使用关键字on update标识
主表删除:使用关键字on delete标识

允许的级联操作:(指的是当主表更新或者删除时,从表相应的字段有哪些操作)
方式一:cascade关联操作,如果主表被更新或者删除,那么从表也会执行相应的操作
方式二,从表设置set null ,表示从表不指向任何主表记录(推荐操作,因为删除数据要慎重!!)
alter table student add foreign key (class_id) references class (class_id) on delete set null;
要想设置null,此外键就得允许为空,若此外键不允许为空,就不能这样做
方式三:拒绝主表的相关操作:restrict
三种方式中,restrict是默认的操作,在二标题中就有体现
修改外键:
先删除,再创建,通过修改表完成
alter table student drop foreign key 主表id;//主表id通过show create table tb_name中的constraint字段
删除外键需要通过指定外键名称达到目的(注意只是删除了外键这个约束,而不是删除此字段,所以从表中的数据不会有丢失)

可以通过在创建外键时,指定名称,或者mysql默认生成的名称
alter table student add foreign key (class_id) references class (class_id) on delete set null;

三、删除主表的数据,从表的操作
方式一:set null

①查看外键名称,为删除外键约束做准备

show create table tb_name中的constraint字段
这里写图片描述

②删除外键约束
alter table student drop foreign key 主表id;

这里写图片描述

③创建外键,在设置联级操作时,必须得创建从表的外键操作后,才能删除主表的字段

alter table student add foreign key (class_id) references class (class_id) on delete set null;
这里写图片描述

④删除主表中的记录,注意从表相应记录的变化

这里写图片描述

方式二cascade
方式一时,每个表中只有一个数据,所以删除了主表中唯一的数据,从表还剩一个数据,不过此数据已经没有相对应的外键了,所以还要新插入数据

//删除外键约束
alter table student drop foreign key student_ibfk_1;(不能用class_id)

//在班级表中添加元素(因为之前把元素给删了),注意插入自动增长,从2开始
insert into class values(null,’php2201’);

//在学生表中插入元素
insert into student values(null,’小D’,2);

//在从表创建外键alter table student drop foreign key class_id;
alter table student add foreign key (class_id) references class (class_id) on delete cascade

//删除主表中的元素
delete from class where class_id=2;

//查看student表
select * from student ;

四、update指只有主表的主键发生变化时,从表才有相应的操作
//因为之前的班级记录删除了,所以插入一个数据(以后要更新此数据)
insert into class values (null,’php’);

//删除外键约束
alter table student drop foreign key student_ibfk_1;

//创建外键约束
alter table student add foreign key (class_id) references class(class_id) on update restrict;

//向从表中插入数据
insert into student values(null,’小Y’,3);

//更新班级中的数据
update class set class_id=100 where class_name=’php’;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (php_1/student, CONSTRAINT student_ibfk_1 FOREIGN KEY (class_id) REFERENCES class (class_id))

五、在实际开发中,并不推荐用级联操作,用的是逻辑外键,在画E-R图时,是有外键相连接的,但是数据库设计时,并不添加foreign key ,比如on delete cascade可以用两个delete语句删除相应的记录。

posted @ 2017-08-12 10:57  测试开发分享站  阅读(170)  评论(0编辑  收藏  举报