mysql触发器

来源:互联网 发布:供给侧改革 知乎 编辑:程序博客网 时间:2024/06/05 19:04

监听数据进行操作:


在当前的表上,设置一个对每行数据的一个监听器。监听相关事件。每当事件发生时。会执行一段由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_studentfor each rowupdate 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 包裹其中的语句块beginupdate czbk set stu_count=stu_count+1;update czbk set cz_money=cz_money+new.stu_money;end$$ 以此双$号作为结束标志创建完成 修改成以分号作为语句结束标志:delimiter ;