<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ā)器的相關(guān)知識(shí),對(duì)其語法、使用舉例和注意事項(xiàng)進(jìn)行了詳細(xì)說明。

    一.             觸發(fā)器概述

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

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

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

    1強(qiáng)化約束

    觸發(fā)器能夠?qū)崿F(xiàn)比CHECK 語句更為復(fù)雜的約束。

    2 跟蹤變化

    觸發(fā)器可以偵測(cè)數(shù)據(jù)庫內(nèi)的操作,從而不允許數(shù)據(jù)庫中未經(jīng)許可的指定更新和變化。

    3 級(jí)聯(lián)運(yùn)行

    觸發(fā)器可以偵測(cè)數(shù)據(jù)庫內(nèi)的操作,并自動(dòng)地級(jí)聯(lián)影響整個(gè)數(shù)據(jù)庫的各項(xiàng)內(nèi)容。例如,某個(gè)表上的觸發(fā)器中包含有對(duì)另外一個(gè)表的數(shù)據(jù)操作(如刪除,更新,插入)而該操作又導(dǎo)致該表上觸發(fā)器被觸發(fā)。

    4 存儲(chǔ)過程的調(diào)用

    為了響應(yīng)數(shù)據(jù)庫更,觸發(fā)器可以調(diào)用一個(gè)或多個(gè)存儲(chǔ)過程,甚至可以通過外部過程的調(diào)用而在DBMS 數(shù)據(jù)庫管理系統(tǒng))本身之外進(jìn)行操作

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

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

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

    1.       語法

    CREATE TRIGGER trigger_name trigger_time trigger_event
        ON tbl_name FOR EACH ROW trigger_stmt

    觸發(fā)程序是與表有關(guān)的命名數(shù)據(jù)庫對(duì)象,當(dāng)表上出現(xiàn)特定事件時(shí),將激活該對(duì)象。

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

    (1)      trigger_name

    觸發(fā)器的名稱。

    (2)      trigger_time

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

    (3)      trigger_event

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

    (4)      tbl_name

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

    (5)      trigger_stmt

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

    2.       使用舉例

    Eg1. 在本實(shí)例中用觸發(fā)器實(shí)現(xiàn)級(jí)聯(lián)刪除的效果。本實(shí)例創(chuàng)建兩個(gè)表:t_organization(組織表)和t_user(用戶表),其中用戶表的org_id與組織表的主鍵建立外鍵關(guān)聯(lián),因此,在刪除組織表中的某記錄時(shí),若用戶表存在關(guān)聯(lián)記錄時(shí),將會(huì)刪除失敗。觸發(fā)器trg_del_org_user用于在用戶刪除組織表的記錄前,首先刪除用戶表的對(duì)應(yīng)記錄,因此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用來更改結(jié)束符,上例中用“$$”作為結(jié)束符,“END$$”中的“$$”表示觸發(fā)器執(zhí)行結(jié)束,最后一句“delimiter ;”將結(jié)束符改成默認(rèn)的“;”。

    3.       注意事項(xiàng)

    1trigger_event能被LOAD DATE語句激活;

    2)不能對(duì)某個(gè)表具有兩個(gè)或多個(gè)具有相同的動(dòng)作時(shí)間和事件的觸發(fā)程序;

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

    4)觸發(fā)程序不能調(diào)用將數(shù)據(jù)返回客戶端的存儲(chǔ)程序,也不能使用采用CALL語句的動(dòng)態(tài)SQL

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

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

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

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

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

    1.       語法

    DROP TRIGGER [schema_name.]trigger_name

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

    2.       使用舉例

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

    DROP TRIGGER trg_del_org_user;

    3.       注意事項(xiàng)

    DROP TRIGGER語句需要SUPER權(quán)限。

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

    1.       語法

    SHOW TRIGGERS;

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

    2.       使用舉例

    運(yùn)行: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參考手冊(cè)》

             《觸發(fā)器概述》

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

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

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

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊(cè)

    關(guān)注blog

    積分與排名

    • 積分 - 2294312
    • 排名 - 3

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: xxx毛茸茸的亚洲| 国产精品无码免费视频二三区| 无码的免费不卡毛片视频| 亚洲国产视频网站| 亚洲免费人成在线视频观看| 成人免费视频国产| 国产va精品免费观看| 91精品导航在线网址免费| 久久久WWW免费人成精品| 国产精品亚洲va在线观看| 日韩亚洲国产高清免费视频| 亚洲成人黄色网址| 亚洲高清在线视频| 亚洲色精品vr一区二区三区| 免费一级毛片在级播放| 日韩免费视频播播| 色视频色露露永久免费观看| 久久久久久国产精品免费免费| 18禁成人网站免费观看| 久久青草91免费观看| 免费无码av片在线观看| 国产精品午夜免费观看网站| 一级特黄a大片免费| 日本精品久久久久久久久免费| 国产亚洲一卡2卡3卡4卡新区| 亚洲欧美成人综合久久久 | 国产精品综合专区中文字幕免费播放| 亚洲爆乳无码专区www| 亚洲综合国产成人丁香五月激情| 亚洲乱码一二三四区乱码| 亚洲国产日韩在线成人蜜芽| 亚洲性色成人av天堂| 亚洲乱人伦精品图片| 亚洲国产精品综合久久久| 亚洲第一网站免费视频| 亚洲成人福利在线| 亚洲六月丁香婷婷综合| 亚洲精品宾馆在线精品酒店| 日韩亚洲人成在线综合| 色爽黄1000部免费软件下载| kk4kk免费视频毛片|