MySQL:触发器
【触发器】与 table 有关的命名数据库对象,当 table 中出现特定事件时,会激活该对象。
监听数据操作:在当前的表中,设置一个对每行数据的一个监听器,监听相关事件。
每当事务发生时,会执行一段由 SQL 完成的功能代码。
【元素】事件、执行代码。
1. 创建触发器
create trigger 名字 事件 执行代码;
【事件】增 insert 、删 delete 、改 update。
事件的时机:after、before。
由此组成了 6 种事件。
即 需要交代清楚 **表 **时机 **动作。
create trigger salary after update on czbk_stu for each row update class set cz_money=cz_money + 20 ; //可执行语句
【tip】当对表czbk_stu执行了update操作时,会启动触发器,执行表class的update操作,给每一行都加20.
2. 触发、触发程序:
当执行如下代码时,即触发程序:
1 update czbk_stu set stu_money=stu_money-20;
【注意】1) 触发器不能重名;
2) 目前 MySQL 只支持一类事件设置一个触发器;
3. 管理触发器
【删除】 drop trigger trigger_name ;
【查看】 show create trigger trigger_name;
【tip】上述例子中的20可以实时变化,利用 old 和 new 关键字来完成:
1 drop trigger salary;
2 create trigger salary after undate on czbk_stu
3 for each row
4 update class set cz_money= cz_money+(old.stu_money-new.stu_money);
//用上述标黄的表达式代替最初直接写的样式,可以根据表 czbk_stu 中,字段stu_money的变化,灵活地改变表 class 中的 cz_money 字段的值。
// 注意:old 和 new 都指的是引起触发的表中的字段,在该例子中指的是 表 czbk_stu。
【思考】对于操作 insert 而言,不能使用old(因为创建数据前, 没有任何数据,谈不上 old);
操作 delete 不能使用 new。
4. 若一个触发程序,由多条 SQL 语句组成,应该:
1) 应该将语句 组成语句块,用 begin / end 标识;
2)语句块的语句需要独立的语句结束符:分号;
命令行:由于触发器内使用;作为语句结束符,
则当命令行客户端遇到;时,应该理解成
触发程序内子语句结束,而不是整个触发程序的结束。
应该通过修改命令行的语句结束符来达到目的,delimiter语句可以完成设置语句结束符。
1 delimiter $$ //用 $$ 表示结束符 2 create trigger ruxue after insert on czbk_stu //当对表 czbk_stu 执行 insert 操作时,会触发如下操作: 3 for each row 4 begin 5 update class set stu_count=stu_count+1; //表 class 中的字段 stu_count加一 , 6 update class set cz_money=cz_money+20; // 表 class 中的字段 cz_money 增加20 7 end 8 $$ // 整段语句的结束 9 10 delimiter ; // 将结束符重新改回分号