<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)論排行榜

    主站蜘蛛池模板: 一级毛片aaaaaa免费看| 毛片基地看看成人免费| 国产精品爱啪在线线免费观看| 亚洲熟妇av一区二区三区| 日本激情猛烈在线看免费观看| 又粗又大又硬又爽的免费视频| 久久亚洲AV成人无码国产电影 | 毛片在线播放免费观看| 在线观看亚洲天天一三视| 中文字幕一区二区免费| 久久被窝电影亚洲爽爽爽| a级特黄毛片免费观看| 亚洲丁香色婷婷综合欲色啪| 亚欧免费视频一区二区三区| 亚洲乱码在线播放| 女性自慰aⅴ片高清免费| 亚洲AV日韩AV永久无码色欲| 亚洲精品老司机在线观看| 最新亚洲成av人免费看| 久久久亚洲精品视频| 亚洲国产精品免费在线观看| 亚洲偷自拍另类图片二区| 国产又粗又猛又爽又黄的免费视频 | 狠狠色伊人亚洲综合网站色| 在线不卡免费视频| jizz在线免费观看| 久久亚洲AV成人无码电影| 无码人妻一区二区三区免费| 国产精品亚洲一区二区三区久久 | 亚洲蜜芽在线精品一区| AV免费网址在线观看| a级毛片免费网站| 自怕偷自怕亚洲精品| 在线jlzzjlzz免费播放| 国产久爱免费精品视频| 亚洲成人在线免费观看| 精品无码国产污污污免费| 精品一区二区三区免费观看| 亚洲国产成人91精品| 亚洲人成色77777在线观看大| 免费A级毛片无码视频|