mysql触发器trigger实例篇 -凯发k8网页登录

那些青春的岁月

  凯发k8网页登录-凯发天生赢家一触即发官网 :: 凯发k8网页登录首页 :: 联系 :: 聚合  :: 管理
  500 posts :: 0 stories :: 135 comments :: 0 trackbacks
mysql触发器trigger实例篇
发表于668 天前 ⁄  ⁄ 

以前关注的数据存储过程不太懂其中奥妙,最近遇到跨,同时对多个表进行curd(create增、update改、read读、delete删),怎么才能让繁琐的数据curd同步变得更容易呢?相信很多人会首先想到了存储过程、触发器,这种想法确实不错。于是饶有兴趣地亲自写了cud(增、改、删)触发器的实例,用触发器实现多表数据同步更新。

定义: 何为mysql触发器?

在mysql server里面也就是对某一个表的一定的操作,触发某种条件(insert,update,delete 等),从而自动执行的一段程序。从这种意义上讲触发器是一个特殊的存储过程。下面通过mysql触发器实例,来了解一下触发器的工作过程吧!

一、创建mysql实例数据表:

在mysql的默认的测试test数据库下,创建两个表t_a与t_b:



    /*table structure for table `t_a` */
    drop table if exists `t_a`;
    create table `t_a` (
      `id` smallint(1) unsigned not null auto_increment,
      `username` varchar(20) default null,
      `groupid` mediumint(8) unsigned not null default '0',
      primary key (`id`)
    ) engine=myisam auto_increment=16 default charset=latin1;
     
    /*data for the table `t_a` */
    lock tables `t_a` write;
    unlock tables;
     
    /*table structure for table `t_b` */
    drop table if exists `t_b`;
    create table `t_b` (
      `id` smallint(1) unsigned not null auto_increment,
      `username` varchar(20) default null,
      `groupid` mediumint(8) unsigned not null default '0',
      primary key (`id`)
    ) engine=myisam auto_increment=57 default charset=latin1;
     
    /*data for the table `t_b` */
    lock tables `t_b` write;
    unlock tables;

在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触发器
    drop trigger /*!50032 if exists */ `tr_a_insert`$$
    --不存在tr_a_insert触发器,开始创建触发器
    --trigger触发条件为insert成功后进行触发
    create
        /*!50017 definer = 'root'@'localhost' */
        trigger `tr_a_insert` after insert on `t_a`
        for each row begin
            --trigger触发后,同时对t_b新增同步一条数据
            insert into `t_b` set username = new.username, groupid=new.groupid;
        end;
    $$
     
    delimiter;
2、创建update触发器trigger_a_update:


    delimiter $$
     
    use `test`$$
    --判断数据库中是否存在tr_a_update触发器
    drop trigger /*!50032 if exists */ `tr_a_update`$$
    --不存在tr_a_update触发器,开始创建触发器
    --trigger触发条件为update成功后进行触发
    create
        /*!50017 definer = 'root'@'localhost' */
        trigger `tr_a_update` after update on `t_a`
        for each row begin
        --trigger触发后,当t_a表groupid,username数据有更改时,对t_b表同步一条更新后的数据
          if new.groupid != old.groupid or old.username != new.username then
            update `t_b` set groupid=new.groupid,username=new.username whereusername=old.username and groupid=old.groupid;
          end if;
              
        end;
    $$
     
    delimiter ;
3、创建delete触发器trigger_a_delete:


    delimiter $$
     
    use `test`$$
    --判断数据库中是否存在tr_a_delete触发器
    drop trigger /*!50032 if exists */ `tr_a_delete`$$
    --不存在tr_a_delete触发器,开始创建触发器
    --trigger触发条件为delete成功后进行触发
    create
        /*!50017 definer = 'root'@'localhost' */
        trigger `tr_a_delete` after delete on `t_a`
        for each row begin
            --t_a表数据删除后,t_b表关联条件相同的数据也同步删除
            delete from `t_b` where username=old.username and groupid=old.groupid;
        end;
    $$
     
    delimiter ;

三、测试mysql实例触发器:

分别测试实现t_a与t_b实现数据同步cud(增、改、删)3个triggers

1、测试mysql的实例tr_a_insert触发器:

在t_a表中新增一条数据,然后分别查询t_a/t_b表的数据是否数据同步,测试触发器成功标志,t_a表无论在何种情况下,新增了一条或多条记录集时,没有t_b表做任何数据insert操作,它同时新增了一样的多条记录集。

下面来进行mysql触发器实例测试:



    --t_a表新增一条记录集
        insert into `t_a` (username,groupid) values ('sky54.net',123)
       
        --查询t_a表
        select id,username,groupid from `t_a`
       
        --查询t_b表
        select id,username,groupid from `t_b`

2、测试mysql的实例tr_a_update、tr_a_delete触发器:

这两个mysql触发器测试原理、步骤与tr_a_insert触发器一样的,先修改/删除一条数据,然后分别查看t_a、t_b表的数据变化情况,数据变化同步说明trigger实例成功,否则需要逐步排查错误原因。

世界上任何一种事物都其其优点和缺点,优点与缺点是自身一个相对立的面。当然这里不是强调“世界非黑即白”式的“二元论”,“存在即合理”嘛。当然 mysql触发器的优点不说了,说一下不足之处,mysql trigger没有很好的调试、管理环境,难于在各种系统环境下测试,测试比mysql存储过程要难,所以建议在生成环境下,尽量用存储过程来代替 mysql触发器。

本篇结束前再强调一下,支持触发器的mysql版本需要5.0以上,5.0以前版本的mysql升级到5.0以后版本方可使用触发器哦!








http://blog.csdn.net/hireboy/article/details/18079183



posted on 2016-08-18 17:25 abin 阅读(796) 评论(0)  编辑  收藏 所属分类: mysql

只有注册用户后才能发表评论。


网站导航:
              
 
网站地图