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

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

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

    posts - 297,  comments - 1618,  trackbacks - 0
            本文講述MySql5.x中觸發(fā)器的使用,包括創(chuàng)建觸發(fā)器、刪除觸發(fā)器和查詢觸發(fā)器的相關知識,對其語法、使用舉例和注意事項進行了詳細說明。

    一.             觸發(fā)器概述

           觸發(fā)器是一種特殊類型的存儲過程,它主要是通過事件進行觸發(fā)而被執(zhí)行的(存儲過程可以通過存儲過程名字而被直接調用)。

    當對某一表進行諸如UPDATE INSERT DELETE 這些操作時,就會自動執(zhí)行觸發(fā)器所定義的SQL 語句。

    觸發(fā)器的主要作用是實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。除此之外,觸發(fā)器還有其它許多不同的功能:

    1強化約束

    觸發(fā)器能夠實現比CHECK 語句更為復雜的約束。

    2 跟蹤變化

    觸發(fā)器可以偵測數據庫內的操作,從而不允許數據庫中未經許可的指定更新和變化。

    3 級聯運行

    觸發(fā)器可以偵測數據庫內的操作,并自動地級聯影響整個數據庫的各項內容。例如,某個表上的觸發(fā)器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發(fā)器被觸發(fā)。

    4 存儲過程的調用

    為了響應數據庫更,觸發(fā)器可以調用一個或多個存儲過程,甚至可以通過外部過程的調用而在DBMS 數據庫管理系統(tǒng))本身之外進行操作

    總體而言,觸發(fā)器性能通常比較低。當運行觸發(fā)器時,系統(tǒng)處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在內存中也不在數據庫設備上,而刪除表和插入表總是位于內存中。可見觸發(fā)器所參照的其它表的位置決定了操作要花費的時間長短。

    在實際的項目中,不推薦使用觸發(fā)器。

    二.             創(chuàng)建觸發(fā)器——CREATE TRIGGER

    1.       語法

    CREATE TRIGGER trigger_name trigger_time trigger_event
        ON tbl_name FOR EACH ROW trigger_stmt

    觸發(fā)程序是與表有關的命名數據庫對象,當表上出現特定事件時,將激活該對象。

    觸發(fā)程序與命名為tbl_name的表相關,而且這個相關表必須引用永久性表,不能與臨時表或視圖關聯起來。

    (1)      trigger_name

    觸發(fā)器的名稱。

    (2)      trigger_time

    觸發(fā)器的動作時間,可在事件之前(BEFORE)或事件之后(AFTER)。

    (3)      trigger_event

    可為INSERTUPDATEDELETE,分別表示在插入、更新和刪除新行時激活觸發(fā)程序。

    (4)      tbl_name

    與該觸發(fā)器相關的永久性表。

    (5)      trigger_stmt

    觸發(fā)程序激活時執(zhí)行的語句。若有多個執(zhí)行語句時,可使用BEGIN……END復合語句結構。

    2.       使用舉例

    Eg1. 在本實例中用觸發(fā)器實現級聯刪除的效果。本實例創(chuàng)建兩個表:t_organization(組織表)和t_user(用戶表),其中用戶表的org_id與組織表的主鍵建立外鍵關聯,因此,在刪除組織表中的某記錄時,若用戶表存在關聯記錄時,將會刪除失敗。觸發(fā)器trg_del_org_user用于在用戶刪除組織表的記錄前,首先刪除用戶表的對應記錄,因此trigger_timeBEFOREtrigger_eventDELETE

    DROP TABLE IF EXISTS t_user;

    DROP TABLE IF EXISTS t_organization;

    CREATE TABLE t_organization

    (

    org_id INT NOT NULL PRIMARY KEY,

    name VARCHAR(50) NOT NULL,

        description VARCHAR(255),

        gen_time DATETIME NOT NULL

    );

    INSERT INTO t_organization VALUES(1, 'test ', NULL, NOW());

    CREATE TABLE t_user

    (

    user_id VARCHAR(50) NOT NULL PRIMARY KEY,

    name VARCHAR(50) NOT NULL,

    org_id INT NOT NULL,

    description VARCHAR(255),

    gen_time DATETIME NOT NULL,

    constraint fk_org_id_user_org foreign key (org_id)

          references t_organization (org_id) on delete restrict on update restrict

       );

       INSERT INTO t_user VALUES('amigo ', 'xiexingxing', 1, NULL, NOW());

    delimiter $$

    CREATE TRIGGER trg_del_org_user BEFORE DELETE ON t_organization

     FOR EACH ROW BEGIN

         DELETE FROM t_user WHERE t_user.org_id = OLD.org_id;

    END$$

    delimiter ;

    其中delimiter用來更改結束符,上例中用“$$”作為結束符,“END$$”中的“$$”表示觸發(fā)器執(zhí)行結束,最后一句“delimiter ;”將結束符改成默認的“;”。

    3.       注意事項

    1trigger_event能被LOAD DATE語句激活;

    2)不能對某個表具有兩個或多個具有相同的動作時間和事件的觸發(fā)程序;

    3)觸發(fā)程序名稱存在于方案的名稱空間內,這意味著,在1個方案中,所有的觸發(fā)程序必須具有唯一的名稱。位于不同方案中的觸發(fā)程序可以具有相同的名稱;

    4)觸發(fā)程序不能調用將數據返回客戶端的存儲程序,也不能使用采用CALL語句的動態(tài)SQL

    5)觸發(fā)程序不能使用以顯式或隱式方式開始或結束事務的語句,如START TRANSACTIONCOMMITROLLBACK

    6)在INSERT觸發(fā)程序中,僅能使用NEW.col_name,沒有舊行。在DELETE觸發(fā)程序中,僅能使用OLD.col_name,沒有新行。在UPDATE觸發(fā)程序中,可以使用OLD.col_name來引用更新前的某一行的列,也能使用NEW.col_name來引用更新后的行中的列;

    7)用OLD命名的列是只讀的。你可以引用它,但不能更改它。對于用NEW命名的列,如果具有SELECT權限,可引用它。在BEFORE觸發(fā)程序中,如果你具有UPDATE權限,可使用“SET NEW.col_name = value”更改它的值;

    8)在BEFORE觸發(fā)程序中,AUTO_INCREMENT列的NEW值為0,不是實際插入新記錄時將自動生成的序列號。

    三.             刪除觸發(fā)器——DROP TRIGGER

    1.       語法

    DROP TRIGGER [schema_name.]trigger_name

    該語句用戶刪除觸發(fā)器,[schema_name.]用于指定所在的數據庫的名稱,若未加,則默認為當前選中的數據庫。

    2.       使用舉例

    Eg. 刪除在前面的小節(jié)中創(chuàng)建的觸發(fā)器trg_del_org_user

    DROP TRIGGER trg_del_org_user;

    3.       注意事項

    DROP TRIGGER語句需要SUPER權限。

    四.             查詢觸發(fā)器——SHOW TRIGGERS

    1.       語法

    SHOW TRIGGERS;

    該語句用于查詢觸發(fā)器。

    2.       使用舉例

    運行:SHOW TRIGGERS;

    輸出的主要信息如下:

    | Trigger  | Event | Table | Statement | Timing | Created | sql_mode

    | trg_del_org_user | DELETE | t_organization | BEGIN

         DELETE FROM t_user WHERE t_user.org_id = OLD.org_id;

    END | BEFORE | NULL    | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBST

    ITUTION |

    參考文章:《MySql5.1參考手冊》

             《觸發(fā)器概述》

              觸發(fā)器小例子
    posted on 2007-12-27 10:38 阿蜜果 閱讀(3228) 評論(0)  編輯  收藏 所屬分類: MySql
    <2007年12月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

          生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
          我的作品:
          玩轉Axure RP  (2015年12月出版)
          

          Power Designer系統(tǒng)分析與建模實戰(zhàn)  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關注blog

    積分與排名

    • 積分 - 2294512
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日本亚洲高清乱码中文在线观看| 一区二区三区精品高清视频免费在线播放 | 亚洲电影日韩精品| 亚洲首页国产精品丝袜| 亚洲av永久无码精品三区在线4| 久久av无码专区亚洲av桃花岛| 亚洲乱码中文论理电影| 无码一区二区三区亚洲人妻| 免费国产成人18在线观看| 国产一卡2卡3卡4卡无卡免费视频| 日本一道本高清免费| 亚洲AV无码一区二区二三区软件| 亚洲国产精品xo在线观看| 日韩精品无码永久免费网站| 3344免费播放观看视频 | 黄网址在线永久免费观看| 最新国产AV无码专区亚洲 | 亚洲精品无码高潮喷水A片软| 中文精品人人永久免费| 成年女人免费碰碰视频| 亚洲最大激情中文字幕| 亚洲AV日韩综合一区尤物| 一级特黄aaa大片免费看| 2020久久精品国产免费| 亚洲伊人成无码综合网 | 国产亚洲视频在线| 亚洲精品国产福利一二区| 亚洲五月丁香综合视频| 人妻在线日韩免费视频| 免费看美女让人桶尿口| 亚洲国产一区二区a毛片| 免费无码AV一区二区| 中字幕视频在线永久在线观看免费| 激情97综合亚洲色婷婷五| 亚洲日本VA午夜在线电影| 最近最新高清免费中文字幕| 4338×亚洲全国最大色成网站| 亚洲日本成本人观看| 黄页网站在线看免费| 亚洲一级二级三级不卡| 中文毛片无遮挡高清免费|