1、监听数据进行操作:
在当前的表上,设置一个对每行数据的一个监听器,监听相关相关事件。每当事件发生时,会执行一段由sql完成的一段功能代码。
触发器的元素:事件,执行代码。
创建触发器:create trigger名字 事件 执行代码
事件:插入insert,删除delete,修改update
事件的时机:执行之前和执行之后。after before
由时机和事件在一起形成了六种事件。before insert,before delete,before update,after insert,after delete,after update
示例:
create trigger jiaobanfei after update(after update类型事件代码) on czbk_student(表名,这里表示被监听的表)
for each row
update class set cz_money=cz_money-20(被监听表发生相应改变后的处理执行代码);
注意:1)触发器不能重名;2)目前mysql只支持一类事件设置一个触发器。
2、管理触发器
删除 drop trigger trigger_name,查看 show create trigger trigger_name
3、在触发器内,获得触发该触发程序时的数据:
利用触发程序内的new 和old来完成
old:监听事件所在表上的数据,在事件发生之前时的数据。旧的数据。 New:监听表上,事件发生之后,新处理完毕的数据。数据,就是触发该事件的记录。
drop trigger jiaobanfei:
create trigger jiaobanfei after update on czbk_student
for each row
update class set cz_money=cz_money+(old.stu_money-new.stu_money);
-----------------------------------------------------------------------------
update czbk_student set stu_money=stu_money-500 where id=1;
示例:
4、事件是insert,不能使用old(因为本身不存在这个数据);事件是delete,不能使用new(因为删除后也不存在新的数据)
如果一个触发程序由多条sql语句组成。
应该:
1、将语句组成语句块(begin end)用来标志语句块
2、语句块的语句需要独立的语句结束符,分号;
3、命名行:由于触发器程序内使用分号作为语句结束符。那么当命令行客户端碰到分号时,就应该理解成触发程序内子语句结束,而不是整个创建触发器的语句结束。应该通过修改命令行的语句结束符达到目的。delimiter语句可以完成设置语句结束符。
delimiter $$
create trigger ruxue after insert on czbk_student
for each row
begin
update class set stu_count=stu_count+1;
update class set cz_money=cz_money+20;
end
$$
delimiter;
测试:
究竟可以触发哪些触发器:
insert into on duplicate key update
Replace