监听数据进行操作:
在当前的表上,设置一个对每行数据的一个监听器。监听相关事件。每当事件发生时。会执行一段由sql完成的一段功能代码。
触发器的元素:
事件,执行代码。
创建触发器:
create trigger 名字 事件 执行性代码。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Create trigger 名字 事件 执行性代码。
事件:插入 insert
删除 delete
修改 update
事件的时机:执行之前和执行之后,After before
由时机和事件在一起形成了六个mysql事件
befor insert ,before delete,before update
after insert,after delete,after update
一个完整的事件,在表上的什么时机的什么动作上。
可执行代码:
sql语句组成的代码。
eq:create trigger jiaobanfei
after update on czbk_student--->事件
for each row
update czbk set cz_money=cz_money+20-->可执行性代码
如何触发,触发程序:
特定事件发生,即触发:
update czbk-student set stu_money=stu_money+20 where id=1
NOTIC:
1,触发器不能同名。
2,目前mysql只支持一类事件设置一个触发器。
管理触发器:
删除触发器:
drop trigger Triger_name
查看触发器:
show triggers \G
如果你在触发器里面对刚刚插入的数据进行了 insert/update, 会造成循环的调用.
如:
create trigger test before update on test for each row update test set NEW.updateTime = NOW() where id=NEW.ID; END
应该使用set:
create trigger test before update on test for each row set NEW.updateTime = NOW(); END
create trigger jiaobanfei_new after update on czbk_student
for each row
update czbk set cz_money=cz_money+(old.stu_money-new.stu_money);
old:代表事件发生之前,监听表上的旧数据。
new:代表事件发生之后,监听表上的新数据。
update :old 和new 可以同时使用。即更新之前,更新之后都存在数据。
insert:只能使用new ,不能使用old,因为insert之前是没有数据的。
delete:只能使用old,不能使用new,因为删除之后是没有数据记录的。
如果一个触发器触发程序有多条语句组成:
1,语句组成语句块(begin end)用来标识语句块。
2,语句块的语句需要独立的语句结束符,分好。
命令行:由于触发器程序内使用分好作为语句结束符。那么当命令行客户端碰到分号时,就应该理解成触发程序内的子语句结束
而不是整个创建触发器的语句结束。
应该通过修改命令行的语句结束符达到目的
Delimiter语句可以完成设置语句结束符。
delimiter $$ //修改分号作为语句结束的标志
create trigger jiaobanfei_new after insert on czbk_student
for each row
//用bigin.....end 包裹其中的语句块
begin
update czbk set stu_count=stu_count+1;
update czbk set cz_money=cz_money+new.stu_money;
end
$$ 以此双$号作为结束标志
创建完成 修改成以分号作为语句结束标志:
delimiter ;