MySQL触发器Trigger实例篇

  • 来源:本站
  • 发布时间:2019-08-13
  • 105已阅读
您现在的位置:首页 >> 现代文学 >> 文章
简介 MySQL触发器Trigger实例篇以前关注的数据存储过程不太懂其中奥妙,最近遇到跨,同时对多个表进行CURD(Create增、Update改、Read读、Delete删),怎么才能让繁琐的数

	MySQL触发器Trigger实例篇

MySQL触发器Trigger实例篇以前关注的数据存储过程不太懂其中奥妙,最近遇到跨,同时对多个表进行CURD(Create增、Update改、Read读、Delete删),怎么才能让繁琐的数据CURD同步变得更容易呢?相信很多人会首先想到了存储过程、触发器,这种想法确实不错。

于是饶有兴趣地亲自写了CUD(增、改、删)触发器的实例,用触发器实现多表数据同步更新。 定义:何为MySQL触发器?在MySQLServer里面也就是对某一个表的一定的操作,触发某种条件(Insert,Update,Delete等),从而自动执行的一段程序。

从这种意义上讲触发器是一个特殊的存储过程。 下面通过MySQL触发器实例,来了解一下触发器的工作过程吧!一、创建MySQL实例数据表:在mysql的默认的测试test数据库下,创建两个表t_a与t_b:/*Tablestructurefortable`t_a`*/DROPTABLEIFEXISTS`t_a`;CREATETABLE`t_a`(`id`smallint(1)unsignedNOTNULLAUTO_INCREMENT,`username`varchar(20)DEFAULTNULL,`groupid`mediumint(8)unsignedNOTNULLDEFAULT0,PRIMARYKEY(`id`))ENGINE=MyISAMAUTO_INCREMENT=16DEFAULTCHARSET=latin1;/*Dataforthetable`t_a`*/LOCKTABLES`t_a`WRITE;UNLOCKTABLES;/*Tablestructurefortable`t_b`*/DROPTABLEIFEXISTS`t_b`;CREATETABLE`t_b`(`id`smallint(1)unsignedNOTNULLAUTO_INCREMENT,`username`varchar(20)DEFAULTNULL,`groupid`mediumint(8)unsignedNOTNULLDEFAULT0,PRIMARYKEY(`id`))ENGINE=MyISAMAUTO_INCREMENT=57DEFAULTCHARSET=latin1;/*Dataforthetable`t_b`*/LOCKTABLES`t_b`WRITE;UNLOCKTABLES;在t_a表上分创建一个CUD(增、改、删)3个触发器,将t_a的表数据与t_b同步实现CUD,注意创建触发器每个表同类事件有且仅有一个对应触发器,为什么只能对一个触发器,不解释啦,看MYSQL的说明帮助文档吧。 二、创建MySQL实例触发器:在实例数据表t_a上依次按照下面步骤创建tr_a_insert、tr_a_update、tr_a_delete三个触发器1、创建INSERT触发器trigger_a_insert:DELIMITER$$USE`test`$$--判断数据库中是否存在tr_a_insert触发器DROPTRIGGER/*!50032IFEXISTS*/`tr_a_insert`$$--不存在tr_a_insert触发器,开始创建触发器--Trigger触发条件为insert成功后进行触发CREATE/*!50017DEFINER=rootlocalhost*/TRIGGER`tr_a_insert`AFTERINSERTON`t_a`FOREACHROWBEGIN--Trigger触发后,同时对t_b新增同步一条数据INSERTINTO`t_b`SETusername=,groupid=;END;$$DELIMITER;2、创建UPDATE触发器trigger_a_update:DELIMITER$$USE`test`$$--判断数据库中是否存在tr_a_update触发器DROPTRIGGER/*!50032IFEXISTS*/`tr_a_update`$$--不存在tr_a_update触发器,开始创建触发器--Trigger触发条件为update成功后进行触发CREATE/*!50017DEFINER=rootlocalhost*/TRIGGER`tr_a_update`AFTERUPDATEON`t_a`FOREACHROWBEGIN--Trigger触发后,当t_a表groupid,username数据有更改时,对t_b表同步一条更新后的数据!=!=`t_b`SETgroupid=,username===;ENDIF;END;$$DELIMITER;3、创建DELETE触发器trigger_a_delete:DELIMITER$$USE`test`$$--判断数据库中是否存在tr_a_delete触发器DROPTRIGGER/*!50032IFEXISTS*/`tr_a_delete`$$--不存在tr_a_delete触发器,开始创建触发器--Trigger触发条件为delete成功后进行触发CREATE/*!50017DEFINER=rootlocalhost*/TRIGGER`tr_a_delete`AFTERDELETEON`t_a`FOREACHROWBEGIN--t_a表数据删除后,t_b表关联条件相同的数据也同步删除DELETEFROM`t_b`WHEREusername==;END;$$DELIMITER;三、测试MySQL实例触发器:分别测试实现t_a与t_b实现数据同步CUD(增、改、删)3个Triggers1、测试MySQL的实例tr_a_insert触发器:在t_a表中新增一条数据,然后分别查询t_a/t_b表的数据是否数据同步,测试触发器成功标志,t_a表无论在何种情况下,新增了一条或多条记录集时,没有t_b表做任何数据insert操作,它同时新增了一样的多条记录集。 下面来进行MySQL触发器实例测试:--t_a表新增一条记录集INSERTINTO`t_a`(username,groupid)VALUES(,123)--查询t_a表SELECTid,username,groupidFROM`t_a`--查询t_b表SELECTid,username,groupidFROM`t_b`2、测试MySQL的实例tr_a_update、tr_a_delete触发器:这两个MySQL触发器测试原理、步骤与tr_a_insert触发器一样的,先修改/删除一条数据,然后分别查看t_a、t_b表的数据变化情况,数据变化同步说明Trigger实例成功,否则需要逐步排查错误原因。

世界上任何一种事物都其其优点和缺点,优点与缺点是自身一个相对立的面。

当然这里不是强调世界非黑即白式的二元论,存在即合理嘛。

当然MySQL触发器的优点不说了,说一下不足之处,MySQLTrigger没有很好的调试、管理环境,难于在各种系统环境下测试,测试比MySQL存储过程要难,所以建议在生成环境下,尽量用存储过程来代替MySQL触发器。 本篇结束前再强调一下,支持触发器的MySQL版本需要以上,以前版本的MySQL升级到以后版本方可使用触发器哦!http:///hireboy/article/details/18079183。