<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
    MySQL觸發器Trigger實例篇
    發表于668 天前 ⁄ IT技術 ⁄ 暫無評論

    以前關注的數據存儲過程不太懂其中奧妙,最近遇到跨數據庫,同時對多個表進行CURD(Create增、Update改、Read讀、Delete刪),怎么才能讓繁瑣的數據CURD同步變得更容易呢?相信很多人會首先想到了MySQL存儲過程、觸發器,這種想法確實不錯。于是饒有興趣地親自寫了CUD(增、改、刪)觸發器的實例,用觸發器實現多表數據同步更新。

    MySQL觸發器Trigger實例篇

    定義: 何為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 閱讀(1090) 評論(0)  編輯  收藏 所屬分類: mysql
    主站蜘蛛池模板: 久久www免费人成精品香蕉| 极品色天使在线婷婷天堂亚洲| caoporm碰最新免费公开视频| 在线免费一区二区| 亚洲卡一卡二卡乱码新区| 67194熟妇在线永久免费观看 | 亚洲成?Ⅴ人在线观看无码| 色天使色婷婷在线影院亚洲| 国产网站在线免费观看| 麻豆69堂免费视频| 久久精品国产亚洲Aⅴ香蕉| 韩国免费a级作爱片无码| 精品久久香蕉国产线看观看亚洲| 国产白丝无码免费视频| 亚洲精品免费在线观看| 国产一卡二卡四卡免费| 中文日韩亚洲欧美制服| 国产无遮挡吃胸膜奶免费看| eeuss影院免费直达入口| 久久九九亚洲精品| 在线观看www日本免费网站| 亚洲av一本岛在线播放| 国产老女人精品免费视频| 九九九国产精品成人免费视频| 国产亚洲av人片在线观看| 最近最新高清免费中文字幕 | 亚洲专区先锋影音| 午夜性色一区二区三区免费不卡视频 | 国产精品酒店视频免费看| 无码免费又爽又高潮喷水的视频| 亚洲色精品aⅴ一区区三区| 67194熟妇在线永久免费观看 | 国产在线观看无码免费视频| 亚洲自偷自拍另类12p| 最好免费观看韩国+日本| gogo免费在线观看| 亚洲国语在线视频手机在线| 亚洲AⅤ无码一区二区三区在线| 黄网站色视频免费在线观看的a站最新| 亚洲五月综合网色九月色| 亚洲一区二区三区在线播放|