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

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

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

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
    MySQL觸發(fā)器Trigger實(shí)例篇
    發(fā)表于668 天前 ⁄ IT技術(shù) ⁄ 暫無評論

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

    MySQL觸發(fā)器Trigger實(shí)例篇

    定義: 何為MySQL觸發(fā)器?

    在MySQL Server里面也就是對某一個表的一定的操作,觸發(fā)某種條件(Insert,Update,Delete 等),從而自動執(zhí)行的一段程序。從這種意義上講觸發(fā)器是一個特殊的存儲過程。下面通過MySQL觸發(fā)器實(shí)例,來了解一下觸發(fā)器的工作過程吧!

    一、創(chuàng)建MySQL實(shí)例數(shù)據(jù)表:

    在mysql的默認(rèn)的測試test數(shù)據(jù)庫下,創(chuàng)建兩個表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表上分創(chuàng)建一個CUD(增、改、刪)3個觸發(fā)器,將t_a的表數(shù)據(jù)與t_b同步實(shí)現(xiàn)CUD,注意創(chuàng)建觸發(fā)器每個表同類事件有且僅有一個對應(yīng)觸發(fā)器,為什么只能對一個觸發(fā)器,不解釋啦,看MYSQL的說明幫助文檔吧。

    二、創(chuàng)建MySQL實(shí)例觸發(fā)器:

    在實(shí)例數(shù)據(jù)表t_a上依次按照下面步驟創(chuàng)建tr_a_insert、tr_a_update、tr_a_delete三個觸發(fā)器

    1、創(chuàng)建INSERT觸發(fā)器trigger_a_insert:



        DELIMITER $$
         
        USE `test`$$
         
        --判斷數(shù)據(jù)庫中是否存在tr_a_insert觸發(fā)器
        DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_insert`$$
        --不存在tr_a_insert觸發(fā)器,開始創(chuàng)建觸發(fā)器
        --Trigger觸發(fā)條件為insert成功后進(jìn)行觸發(fā)
        CREATE
            /*!50017 DEFINER = 'root'@'localhost' */
            TRIGGER `tr_a_insert` AFTER INSERT ON `t_a`
            FOR EACH ROW BEGIN
                --Trigger觸發(fā)后,同時對t_b新增同步一條數(shù)據(jù)
                INSERT INTO `t_b` SET username = NEW.username, groupid=NEW.groupid;
            END;
        $$
         
        DELIMITER;
    2、創(chuàng)建UPDATE觸發(fā)器trigger_a_update:


        DELIMITER $$
         
        USE `test`$$
        --判斷數(shù)據(jù)庫中是否存在tr_a_update觸發(fā)器
        DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_update`$$
        --不存在tr_a_update觸發(fā)器,開始創(chuàng)建觸發(fā)器
        --Trigger觸發(fā)條件為update成功后進(jìn)行觸發(fā)
        CREATE
            /*!50017 DEFINER = 'root'@'localhost' */
            TRIGGER `tr_a_update` AFTER UPDATE ON `t_a`
            FOR EACH ROW BEGIN
            --Trigger觸發(fā)后,當(dāng)t_a表groupid,username數(shù)據(jù)有更改時,對t_b表同步一條更新后的數(shù)據(jù)
              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、創(chuàng)建DELETE觸發(fā)器trigger_a_delete:


        DELIMITER $$
         
        USE `test`$$
        --判斷數(shù)據(jù)庫中是否存在tr_a_delete觸發(fā)器
        DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_delete`$$
        --不存在tr_a_delete觸發(fā)器,開始創(chuàng)建觸發(fā)器
        --Trigger觸發(fā)條件為delete成功后進(jìn)行觸發(fā)
        CREATE
            /*!50017 DEFINER = 'root'@'localhost' */
            TRIGGER `tr_a_delete` AFTER DELETE ON `t_a`
            FOR EACH ROW BEGIN
                --t_a表數(shù)據(jù)刪除后,t_b表關(guān)聯(lián)條件相同的數(shù)據(jù)也同步刪除
                DELETE FROM `t_b` WHERE username=Old.username AND groupid=OLD.groupid;
            END;
        $$
         
        DELIMITER ;

    三、測試MySQL實(shí)例觸發(fā)器:

    分別測試實(shí)現(xiàn)t_a與t_b實(shí)現(xiàn)數(shù)據(jù)同步CUD(增、改、刪)3個Triggers

    1、測試MySQL的實(shí)例tr_a_insert觸發(fā)器:

    在t_a表中新增一條數(shù)據(jù),然后分別查詢t_a/t_b表的數(shù)據(jù)是否數(shù)據(jù)同步,測試觸發(fā)器成功標(biāo)志,t_a表無論在何種情況下,新增了一條或多條記錄集時,沒有t_b表做任何數(shù)據(jù)insert操作,它同時新增了一樣的多條記錄集。

    下面來進(jìn)行MySQL觸發(fā)器實(shí)例測試:



        --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的實(shí)例tr_a_update、tr_a_delete觸發(fā)器:

    這兩個MySQL觸發(fā)器測試原理、步驟與tr_a_insert觸發(fā)器一樣的,先修改/刪除一條數(shù)據(jù),然后分別查看t_a、t_b表的數(shù)據(jù)變化情況,數(shù)據(jù)變化同步說明Trigger實(shí)例成功,否則需要逐步排查錯誤原因。

    世界上任何一種事物都其其優(yōu)點(diǎn)和缺點(diǎn),優(yōu)點(diǎn)與缺點(diǎn)是自身一個相對立的面。當(dāng)然這里不是強(qiáng)調(diào)“世界非黑即白”式的“二元論”,“存在即合理”嘛。當(dāng)然 MySQL觸發(fā)器的優(yōu)點(diǎn)不說了,說一下不足之處,MySQL Trigger沒有很好的調(diào)試、管理環(huán)境,難于在各種系統(tǒng)環(huán)境下測試,測試比MySQL存儲過程要難,所以建議在生成環(huán)境下,盡量用存儲過程來代替 MySQL觸發(fā)器。

    本篇結(jié)束前再強(qiáng)調(diào)一下,支持觸發(fā)器的MySQL版本需要5.0以上,5.0以前版本的MySQL升級到5.0以后版本方可使用觸發(fā)器哦!








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



    posted on 2016-08-18 17:25 abin 閱讀(1077) 評論(0)  編輯  收藏 所屬分類: mysql
    主站蜘蛛池模板: 精品亚洲成a人片在线观看| 妞干网在线免费观看| 久久亚洲色一区二区三区| 羞羞网站免费观看| va亚洲va日韩不卡在线观看| 国产精品亚洲lv粉色| 在线观看国产情趣免费视频| 精品久久久久久亚洲综合网| 国产又黄又爽又猛的免费视频播放 | 花蝴蝶免费视频在线观看高清版| 国产亚洲人成网站在线观看| h片在线观看免费| 国产亚洲一区二区在线观看| 一级毛片免费毛片一级毛片免费 | 1a级毛片免费观看| 亚洲精品无码成人片在线观看 | www在线观看免费视频| 亚色九九九全国免费视频| 亚洲一级在线观看| 精品国产污污免费网站| 亚洲国产精品婷婷久久| 日韩毛片免费无码无毒视频观看| 亚洲人成色77777在线观看 | 国产亚洲综合色就色| 91人人区免费区人人| 丁香五月亚洲综合深深爱| 亚洲av日韩aⅴ无码色老头| 999国内精品永久免费观看| 亚洲中文字幕AV每天更新| 亚洲狠狠爱综合影院婷婷| 国产精品免费大片| 亚洲综合一区国产精品| 亚洲人成无码网站久久99热国产| 欧洲人成在线免费| 亚洲私人无码综合久久网| 中文字幕在线亚洲精品| 久久精品免费一区二区喷潮 | 免费无码AV片在线观看软件| 免费国产污网站在线观看不要卡| 好爽好紧好大的免费视频国产| 抽搐一进一出gif免费视频|