触发器
当我们对一张表操作时,同时需要对其他表进行操作时,可以使用触发器。
例如,当一个学生退学,那对应的学生表中的信息会进行移除,成绩表中该学生的信息也需要被移除,因此可以使用触发器:当学生表中的某条信息移除后,其对应的成绩信息会自动进行移除
创建触发器
格式:
create trigger tirggerName BEFORE|AFTER triggerEvent
on tableName FOR EACH ROW tirgger_STMT
其中,
BEFORE|AFTER:表示是在执行某一sql语句前还是在执行后触发事件;
triggerEvent:表示触发事件,包含delete、insert、update语句;
FOR EACH ROW:表示对表中任何一条记录进行操作满足触发条件就会触发该触发器;
tirgger_STMT:表示触发触发器后需要执行什么操作 。
对于triggerEvent中的insert语句,只有NEW是合法的(即tirgger_STMT的条件需要使用NEW);
对于triggerEvent中的delete语句,只有OLD是合法的(即tirgger_STMT的条件需要使用OLD);
对于triggerEvent中的update语句,OLD/NEW都可以。
例子:
学生表中插入一条数据,成绩表中插入一条数据;学生表中删除一条数据,成绩表中删除对应成绩。
create trigger tri_delete_student after delete on student
FOR EACH ROW delete from grade where student_id=OLD.id;
create trigger tri_insert_student after insert on student
FOR EACH ROW insert into grade(chinese,english,math,student_id)
values(0,0,0,NEW.ID);
触发器包含多条执行语句
当我们对执行一段语句时需要同时出发多个事件,比如当我们移除学生表中的某个学生信息时,需要同时移除成绩表中该学生的成绩信息,以及需要对班级表中学生所在班级的人数进行更新
格式:
create trigger tirggerName BEFORE|AFTER triggerEvent
on tableName FOR EACH ROW
BEGIN
tirgger_STMT
END;
其中,tirgger_STMT放在begin和end之间,一般包含多条sql语句,不同的语句间用 ; 隔开。
当我们触发器包含多条执行语句时,可以先使用delimit来重新定义sql结束符:delimiter $$
表示将sql语句结束符为$$,而不是之前的分号,当创建为触发器后,可以再将结束符重新变为分号:delimiter ;
例子:
学生表中删除一条数据,成绩表中删除对应成绩,同时班级表中人数-1。
delimiter
create trigger tri_delete_student AFTER delete on student
FOR EACH ROW
BEGIN
update class set student_count=student_count-1 where id=OLD.class_id;
delete from grade where student_id=OLD.id;
END;
查看触发器
show triggers查看触发器
格式:
show triggers;
其中,Trigger表示触发器名称;Event表示触发动作;Table表示在哪张表中进行触发动作后执行触发器;Statement表示触发器激活后执行什么动作;Timing表示触发器执行的时间是在event之before还是after
通过系统表查看触发器
格式:
use information_schema; //数据库连接到information_schema
select * from triggers where trigger_name='tri_delete_student';
其中查询条件支持模糊查询,可查询到触发器列表信息
删除触发器
格式:
drop trigger_name;