博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql触发器
阅读量:4652 次
发布时间:2019-06-09

本文共 2100 字,大约阅读时间需要 7 分钟。

~~语法~~

CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.

{ BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE }  --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。

        insert     使用 new.cloumn

        delete    使用 old.cloumn

        update   使用 new||old

ON <表名称>  --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW  --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句>  --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。
--你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了。这跟SQL的标准有所不同。

delimiter 定义分隔符  告诉MySQL解释器,该段命令是否已经结束了,是否可以执行。

 

实例:

id   ||    fans   ||   idol               //用户表     A     //用户  粉丝数   偶像数   

id   ||    idol_id                          //关系表    B    //a用户ID      a用户关注偶像ID

功能:当我们在关系表B插入一条数据时,用户表会自动更新粉丝数和偶像数

drop trigger if exists t_B_afterinsert;drop trigger if exists t_B_afterdelete;delimiter |create trigger t_B_afterinsertafter insert on B for each rowbeginupdate A set idol  = idol  +1 where A.UUID = NEW.id ;update A set fans = fans +1 where A.UUID = NEW.idol_id;end|create trigger t_B_afterdeleteafter delete on B for each rowbeginupdate A set idol  = idol -1 where A.id = OLD.id ;update A set fans = fans-1 where A.id = OLD.idol_id;end|delimiter ;

 

if的使用:

IF condition THEN

  sql;

ELSEIF

  sql;

ELSE

  sql;

END IF;

实例:

表A,B分别代表不同类型的内容,例如微博的feed和article。这时我增加一个新表C记录需要所有的评论,我需要在插入和删除表C时都能更新表A或表B的记数。

表A                    id   ||   collect ||

表B                    id   ||   collect  

表C                    id   ||   type    || res_id                  //type=1 为表A评论     2为表B评论 

drop trigger if exists t_C_afterinsert;drop trigger if exists t_C_afterdelete;delimiter |create trigger t_C_afterinsertafter insert on C for each rowbeginif 2 = NEW.type then    update B set collect= collect +1 where B.id = NEW.res_id ;elseif 1= NEW.type then    update A set collect = collect +1 where A.id = NEW.res_id;end if;end|create trigger t_Ccollections_afterdeleteafter delete on C for each rowbeginif 2=OLD.type then    update B  set collect= collect -1 where B.id = OLD.res_id ;elseif 1 = OLD.type then    update A set collect = collect -1 where A.id = OLD.res_id;end if;end|delimiter ;

 

posted on
2015-09-02 18:33 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/olenji/p/4779247.html

你可能感兴趣的文章
事务并发、事务隔离级别
查看>>
求无序数组中第二大的数--快速选择
查看>>
ios文字描边
查看>>
linux命令之pssh命令
查看>>
redis
查看>>
一个JQUERY文件
查看>>
多角度比较市面上的主流「移动推送服务」
查看>>
intellij 设置-试验过的
查看>>
cf 12C Fruits(贪心【简单数学】)
查看>>
探索WebKit内核(一)------ 菜鸟起步
查看>>
Redis Windows版安装详解
查看>>
linux后台运行python程序 nohup
查看>>
吴裕雄--天生自然 高等数学学习:对面积的曲面积分
查看>>
css
查看>>
HUST team contest #E A Mountain Road||poj 3846 (dp)
查看>>
Web应用程序整体测试基础——单元测试
查看>>
通过修改manifest文件来解决Vista/Win7/Win8/win10下应用程序兼容性问题
查看>>
Spark使用总结与分享
查看>>
JMETER - BEANSHELL获取响应结果
查看>>
Line 7.10 : Syntax error
查看>>