2592 · 删除 teachers 表信息时的关联处理(二)
一、题目描述
题目链接:https://www.lintcode.com/learn/210/600 ??LintCode 部门新进了一批科研人员,为了保护他们的人身安全,需要在 teachers 表中,将他们的信息删除。请编写触发器,实现每次删除 teachers 表中的信息时,会在 teachers_bkp 中记录其信息。部分德高望重的科研人员渴望加入中国(CN)国籍,请编写触发器,实现该功能。
??我们需要给 teachers 表添加两个新的触发器,当删除一条教师数据时:
??1、触发器 bkp_teachers_delete:将删除的数据备份到结构相同的备份表 teachers_bkp 中; ??2、触发器 before_teachers_delete:将 teachers_bkp 表中最年长的教师国籍改为 ‘CN’; ??3、触发器 bkp_teachers_delete 需在触发器 before_teachers_delete 之前执行。
二、算法思想
??第一个名为bkp_teachers_delete的触发器比较简单,这里不再介绍。 ??第二个触发器需要在其for each row 语句后面加上一句follows bkp_teachers_delete,表示第二个触发器在第一个触发器之后激活。这里要将 teachers_bkp 表中最年长的教师国籍改为 ‘CN’,但年纪最大的老师国籍可能是’CN’,所以在查询时要加个条件,把国籍为’CN’的去掉。此外查询到的最大年纪的老师可能不止一位,因此要用limit语句进行限制,只取查询结果的第一行。步骤如下: ??1、定义一个变量用来存储查到的符合题目要求的老师的id; ??2、运用子查询,把查到的id赋给之前定义的变量; ?? 3、把该id那一行的国籍改为’CN’。
三、代码
create trigger bkp_teachers_delete
before delete
on teachers for each row
begin
insert into teachers_bkp(name,email,age,country)
values(old.name,old.email,old.age,old.country);
end ;
create trigger before_teachers_delete
before delete
on teachers for each row
follows bkp_teachers_delete
begin
declare id1 int ;
select id into id1
from teachers_bkp
where age in (
select max(age)
from teachers_bkp
where country !='CN' )
limit 1;
update teachers_bkp
set country='CN'
where id=id1 ;
end ;
四、结果
|