首页 > 代码库 > mysql中触发器

mysql中触发器

触发器

场景:

日志系统,记录对学生表有哪些操作!

解决的问题:

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 deleteon select_student for each rowinsert into student_log values (null, ‘delete‘, now(), old.id) -- 执行的sql集合;

 

  

测试,删除记录:

create trigger log_upd_stu after updateon 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 updateon select_student for each rowbeginif 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