计算机二级MySQL笔记(第八章 触发器)
触发器是一个被指定关联到一个表的数据库对象,当对一个表的特定事件出现时,它将会被激活。触发器可以实现比约束更复杂的数据约束。
创建触发器
-
触发器必须引用永久性表,不能是临时表或视图; 同一个表不能拥有两个相同触发时刻和事件的触发器; 每个表最多支持6个触发器,即INSERT、UPDATE、DELETE的之前和之后;
--创建语法 create trigger trigger_name trigger_time trigger_event on tb_name for each row trigger_body; --参数说明: --trigger_name: 触发器名称 --trigger_time: 触发器被触发的时刻,有两个选项 before 和 after --trigger_event: 激活触发器的事件,即insert、update、delete语句 --for each row: 指定触发事件影响的每一行都要激活触发器 --trigger_body: 触发器被激活时,将要执行的SQL语句;如果执行多个语句,可使用 begin...end 复合语句结构
--创建一个触发器,每次插入数据时,将变量str修改为‘one student added’ create trigger tb_student_insert_trigger after insert on tb_student for each row set @str=one student added;
查看触发器
--查看数据库中已有的的触发器,注意这里是数据库,不是表。 show triggers from丨in db_name;
删除触发器
--删除上例创建的触发器 drop trigger if exists db_school.tb_student_insert_trigger;
使用触发器
-
MySQL目前仅支持DML触发器,即INSERT、UPDATE、DELETE触发器(书中说的是5.5版本,可以查看官方手册)。 触发器中有两种虚拟表:NEW表和OLD表(不区分大小写)
1、insert 触发器中可以引用一个名为 new 的虚拟表来访问被插入的行; 2、delete 触发器中可以引用一个名为 old 的虚拟表来访问被删除的行; 3、update 触发器中可以引用一个名为 old 的虚拟表访问更新前的值,也可以引用一个名为 new 的虚拟表访问更新后的值;
-
当触发器涉及对表自身的更新操作时,只能使用 before update 触发器,而 after update 触发器会报错。 在触发器的执行过程中,是先执行 before 触发器,再执行 after 触发器。
--创建触发器,当插入数据时,将str变量值设置为新插入学生的学号 create trigger tb_student_insert_trigger after insert on tb_student for each row set @str=new.studentNo; --创建触发器,每次更新表时,该表中 nation 列的值设置为 native 列的值 create trigger tb_student_update_trigger before update on tb_student for each row set new.nation = old.native;
课后习题
1、创建触发器content_delete_trigger
create trigger db_test.content_delete_trigger after update on content for each row set @str=old content deleted!;
2、创建触发器tb_score_insert_trigger
create trigger db_score.tb_score_insert_trigger after insert on tb_score for each row set @str=new score record added!;
3、创建触发器tb_score_update_trigger
create trigger db_score.tb_score_update_trigger before update on tb_score for each row set new.score = old.score + 1;
4、删除触发器tb_score_update_trigger
drop trigger if exists db.score.tb_score_update_trigger;
