触发器,trigger
场景:
日志系统,记录对学生表有哪些操作!
解决的问题:
1, 得到每条学生记录被修改的时机,才能发出记录日志的动作!
2, 执行某段操作,需要得到当前处理的记录的信息!
触发器:一种编程设计!类似js的基于事件编程的程序设计的理念!可以在某个表的每条记录上,设置一个事件,从而对该表上的某些操作,加以监听!一旦所监听的行为出现,则会执行相应的代码。
记录 =button
(修改,删除,增加) =click
执行操作 =alert(‘Hello’);
以上的所有行为,都是采用sql完成的:
语法
--
create trigger 触发器名字触发条件,监听的内容,触发后执行的操作
CREATE TRIGGER *trigger\_nametrigger\_timetrigger\_event* ON *tbl\_name* FOR EACH ROW *trigger\_stmt*
其中,触发条件,事件。是由事件的时机,与事件的内容组成
时机:之前before,和之后after!
内容:增加insert,删除delete,修改update
因此,一共只有六种事件:
before insert before delete before update
after insert after delete after update
监听的主体是由表中的记录发出的
ontable\_name for each row
执行的操作,就是一段sql的集合!
建立日志表:
执行插入:
日志表内的记录自动增加:
可见 insert into student\_log的触发程序,执行成功!
删除触发器
drop trigger 触发器名字
在触发程序中得到当前触发的记录信息
-----------------
有,两个!
new(新的),old(旧的)
new,和old,都表示触发程序的记录!
new:新的记录。old:旧的记录!
取决于当前操作(intser,update,delete)去使用其中某个:
insert,增加记录,没有旧记录,只有new关键字可以使用
delete,删除记录,没有新纪录,只有old可用!
update,更新,既有新纪录,也有旧记录,更新前是旧记录,而更新后是新纪录!因此可以 new和 old
记录,当前学生被删除之后,记录日志,要求记录学生的id。
测试,删除记录:
此时,留意一下触发器,与具体的语法的执行时机:
当:insert into table操作!
判断,是否有before insert 触发器!有则执行触发程序!
真正执行 insert into
判断,是否有after insert 触发器!有则执行触发程序!
更新日志:
记录更新日志,要求是,只对某部分同学完成更新日志!
只记录,身高超过175学生的更新记录!记录学生id和修改前的身高与之后的身高
需要额外的增加条件判断!
逻辑分支语句:
if 条件 then
语句体
else if 条件 then
语句体
….
else
语句体
end if;
sql语句的结束符问题
可以修改最外层的语句结束符达到目的!
delimiter $$
将语句结束修改成 $$
记住用完后要再修改回来!
如果触发程序由多条语句组成块。此时就需要使用
begin
end 将语句块包裹!
测试:
注意,关于触发器:
1, 一个表上的一个事件只能有一个触发器,如果需要,只能将原始的去掉,新增!
2, 只要事件发生,触发程序就可能执行!一条语句可能触发多个触发程序!
例如:
insert into on duplicate key update
before insert trigger, insert 操作失败before update trigger, update操作, after update
before insert trigger, insert 操作成功after insert trigger
php项目中用的不多
![](2E56EEB0FE0617FF6BB84F7FA7083DC6.png)
上一篇: 25 SQL编程介绍