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

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

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

    少年阿賓

    那些青春的歲月

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

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

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

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

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

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

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

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

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

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



        DELIMITER $$
         
        USE `test`$$
         
        --判斷數(shù)據(jù)庫(kù)中是否存在tr_a_insert觸發(fā)器
        DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_insert`$$
        --不存在tr_a_insert觸發(fā)器,開(kāi)始創(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ā)后,同時(shí)對(duì)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ù)庫(kù)中是否存在tr_a_update觸發(fā)器
        DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_update`$$
        --不存在tr_a_update觸發(fā)器,開(kāi)始創(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ù)有更改時(shí),對(duì)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ù)庫(kù)中是否存在tr_a_delete觸發(fā)器
        DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_delete`$$
        --不存在tr_a_delete觸發(fā)器,開(kāi)始創(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 ;

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

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

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

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

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



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

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

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

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








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



    posted on 2016-08-18 17:25 abin 閱讀(1078) 評(píng)論(0)  編輯  收藏 所屬分類: mysql
    主站蜘蛛池模板: 性做久久久久免费看| 久久久久久亚洲av成人无码国产| 久久夜色精品国产亚洲AV动态图 | 极品美女一级毛片免费| 国产香蕉免费精品视频| 亚洲精品狼友在线播放| 在线观看免费亚洲| AA免费观看的1000部电影| 亚洲AV无码国产精品色午友在线 | 亚洲AV无码一区二区三区国产 | 日本免费中文字幕| 亚洲精品综合久久| 欧美日韩亚洲精品| 成年人免费的视频| 亚洲综合自拍成人| 国产做国产爱免费视频| 免费v片在线观看无遮挡| 亚洲中文字幕无码久久2020| 91麻豆国产免费观看| 亚洲精品无码AV人在线播放| 成年网站免费入口在线观看| 免费理论片51人人看电影| 亚洲影视自拍揄拍愉拍| 在线观看永久免费| 亚洲综合无码一区二区| 久久免费国产精品一区二区| 成人午夜亚洲精品无码网站| 午夜在线免费视频| 亚洲 无码 在线 专区| 亚洲精品无码久久久久APP| 欧美日韩国产免费一区二区三区| 亚洲欧洲日产专区| 95老司机免费福利| 久久久久亚洲AV无码专区体验| 国产偷伦视频免费观看| 国产亚洲欧洲精品| 国色精品va在线观看免费视频 | 91成人免费福利网站在线| 亚洲综合激情另类专区| 一区免费在线观看| 久久亚洲精品无码播放|