触发器
场景:
日志系统,记录对学生表有哪些操作!
解决的问题:
1, 得到每条学生记录被修改的时机,才能发出记录日志的动作!
2, 执行某段操作,需要得到当前处理的记录的信息!
触发器:一种编程设计!类似js的基于事件编程的程序设计的理念!可以在某个表的每条记录上,设置一个事件,从而对该表上的某些操作,加以监听!一旦所监听的行为出现,则会执行相应的代码。
记录 =button
(修改,删除,增加) =click
执行操作 =alert(‘Hello’);
以上的所有行为,都是采用 sql 完成的:
语法
create trigger 触发器名字 触发条件,监听的内容,触发后执行的操作
CREATE TRIGGER trigger_name trigger_time trigger_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
监听的主体是由表中的记录发出的
on table_name for each row
执行的操作,就是一段 sql的集合!
create trigger test_trigger
after insert -- 事件
on select_student for each row -- 哪个表的记录在监听
insert into student_log values (null, 'insert', now(), 'new ID') -- 执行的sql集合
;
建立日志表
create table student_log (
id int primary key auto_increment,
op varchar(10),
op_time datetime,
ps varchar(255)
);
执行插入:
insert into select_student values (null, '欧阳锋', 'male', 22, 1234.56, 178.00);
删除触发器
drop trigger 触发器名字
在触发程序中得到当前触发的记录信息
有,两个!
new(新的),old(旧的)
new,和old,都表示触发程序的记录!
new:新的记录。old:旧的记录!
取决于当前操作(intser,update,delete)去使用其中某个:
insert,增加记录,没有旧记录,只有new关键字可以使用
delete,删除记录,没有新纪录,只有old可用!
update,更新,既有新纪录,也有旧记录,更新前是旧记录,而更新后是新纪录!因此可以 new和 old
记录,当前学生被删除之后,记录日志,要求记录学生的id。
create trigger log_del_stu after delete
on select_student for each row
insert into student_log values (null, 'delete', now(), old.id) -- 执行的sql集合
;
测试,删除记录:
create trigger log_upd_stu after update
on select_student for each row
判断学生的身高是否大于175
记录日志
;
此时,留意一下 触发器,与具体的语法的执行时机:
当:insert into table操作!
判断,是否有before insert 触发器!有则执行触发程序!
真正执行 insert into
判断,是否有after insert 触发器!有则执行触发程序!
更新日志:
记录更新日志,要求是,只对某部分同学完成更新日志!
只记录,身高超过175学生的更新记录!记录学生id和修改前的身高与之后的身高
需要额外的增加条件判断!
逻辑分支语句:
if 条件 then
语句体
else if 条件 then
语句体
….
else
语句体
end if;
sql语句的结束符问题
可以修改 最外层的语句结束符达到目的!
delimiter $$
将语句结束修改成 $$
记住用完后要再修改回来!
delimiter $$
create trigger log_upd_stu after update
on select_student for each row
begin
if old.height > 175 then
insert into student_log values (null, 'update', now(), concat(old.id, ':', old.height, '---', new.height));
end if;
end
$$
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