少年阿賓

          那些青春的歲月

            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ù)庫,同時(shí)對多個(gè)表進(jìn)行CURD(Create增、Update改、Read讀、Delete刪),怎么才能讓繁瑣的數(shù)據(jù)CURD同步變得更容易呢?相信很多人會首先想到了MySQL存儲過程、觸發(fā)器,這種想法確實(shí)不錯(cuò)。于是饒有興趣地親自寫了CUD(增、改、刪)觸發(fā)器的實(shí)例,用觸發(fā)器實(shí)現(xiàn)多表數(shù)據(jù)同步更新。

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

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

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

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

          在mysql的默認(rèn)的測試test數(shù)據(jù)庫下,創(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è)對應(yīng)觸發(fā)器,為什么只能對一個(gè)觸發(fā)器,不解釋啦,看MYSQL的說明幫助文檔吧。

          二、創(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ù)庫中是否存在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ā)后,同時(shí)對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ù)有更改時(shí),對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個(gè)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表無論在何種情況下,新增了一條或多條記錄集時(shí),沒有t_b表做任何數(shù)據(jù)insert操作,它同時(shí)新增了一樣的多條記錄集。

          下面來進(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ā)器:

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

          世界上任何一種事物都其其優(yōu)點(diǎn)和缺點(diǎn),優(yōu)點(diǎn)與缺點(diǎn)是自身一個(gè)相對立的面。當(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 閱讀(1089) 評論(0)  編輯  收藏 所屬分類: mysql
          主站蜘蛛池模板: 巩义市| 罗山县| 高邮市| 阳新县| 牟定县| 井冈山市| 罗城| 滕州市| 余庆县| 克拉玛依市| 靖边县| 河西区| 板桥市| 定陶县| 九江县| 南城县| 太湖县| 南平市| 大同县| 黎平县| 略阳县| 宁德市| 宁河县| 台江县| 防城港市| 广昌县| 泾川县| 东乡县| 灵台县| 响水县| 攀枝花市| 五原县| 榆林市| 新建县| 安乡县| 称多县| 南投县| 米泉市| 偏关县| 新干县| 永丰县|