十一、触发器
触发器:
监听数据进行操作
在当前的表上,设置一个对每行数据的一个监听器,监听相关事件
每当事件发生时,会执行一段由sql完成的一段功能代码。
触发器的元素:
事件,执行代码。
创建触发器:
Create trigger 名字 事件 执行性代码
事件:
插入 insert
删除 delete
修改 update
事件的时机,执行之前和执行之后。After和before
由以上的时机和事件在一起集成了六种事件。
Before insert,before delete,before update
After insert, after delete, after update
一个完整的事件,应该规定,在哪张表上的什么时机的什么动作上,
可执行代码:
Sql语句所组成的代码
创建触发器:
Create trigger jiaobanfei after update on czbk_student(表名)
for each row
update class(表名) set cz_money=cz_money+20
;
解释元素:
事件:after update on czbk_student(表名)
可执行性代码:update class(表名) set cz_money=cz_money+20
触发:触发程序
Update czbk_student set stu_money=stu_money-20 where id=1;
注意:
1.触发器不能同名
2.目前MySQL只支持一类事件设置一个触发器。
管理触发器:
删除:
Drop trigger 触发器名
查看:
Show create trigger 触发器名
触发器的内容不能定死,在触发期内,获得触发该触发程序时的数据
利用触发程序内的new和old来完成。
Old:
表示监听事件所在表上的数据,在事件发生之前的数据,称之为旧的数据。
New:
表示监听事件所在表上的数据,在事件发生之后的数据,称之为新的数据。
数据,触发该事件的记录。
例:
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;
一个问题,想想,如果当前事件发生在insert动作上,或者是delete动作上
答:事件发生在insert动作上,不能使用old。
事件发生在delete动作上,不能使用new.
例:
正确:
Create trigger ruxue after insert on czbk_student
For each row
Update class set stu_count = stu_count+1
;
正确:
Create trigger ruxue after insert on czbk_student
For each row
Update class set stu_count = stu_count+new.id
;
报错:
Create trigger ruxue after insert on czbk_student
For each row
Update class set stu_count = stu_count+old.id
;
Delete同理,有old没有new
如果一个触发程序,由多条sql语句组成。
应该:
1.将语句组成语句块,[begin end]用来标识语句块
2.语句块内的语句需要独立的语句结束符,分号。
命令行,由于触发器程序内使用了分号作为语句结束符。
那么当命令行客户端碰到分号时,就应该理解成触发程序内的子语句结束,
而不是整个创建触发器的语句结束。
应该通过修改命令行的语句结束符达到目的。
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 czbk_student values (2,1980);