触发器

当我们对一张表操作时,同时需要对其他表进行操作时,可以使用触发器。
例如,当一个学生退学,那对应的学生表中的信息会进行移除,成绩表中该学生的信息也需要被移除,因此可以使用触发器:当学生表中的某条信息移除后,其对应的成绩信息会自动进行移除

创建触发器

格式:

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;

mysql触发器做消息提示 mysql触发器输出提示信息_mysql触发器做消息提示


其中,Trigger表示触发器名称;Event表示触发动作;Table表示在哪张表中进行触发动作后执行触发器;Statement表示触发器激活后执行什么动作;Timing表示触发器执行的时间是在event之before还是after

通过系统表查看触发器

格式:

use information_schema; //数据库连接到information_schema
select * from triggers where trigger_name='tri_delete_student';

其中查询条件支持模糊查询,可查询到触发器列表信息

mysql触发器做消息提示 mysql触发器输出提示信息_触发器_02

删除触发器

格式:

drop trigger_name;