天天看點

MySQL5:觸發器

什麼是觸發器

MySQL的觸發器(trigger)和存儲過程一樣,都是嵌入到MySQL中的 一段程式。觸發器是由事件來觸發某個操作,這些事件包括INSERT、UPDATE和DELETE語句。如果定義了觸發程式,當資料庫執行這些語句的時候 就會激發觸發器執行相應的操作,觸發程式是與表有關的命名資料庫對象,當表上出現特定事件時,将激活該對象。

建立觸發器

觸發器是個特殊的存儲過程,不同的是,執行存儲過程要使用CALL語句來調用,而觸發器的執行不需要使用CALL語句調用,也不需要手工啟動,隻要當一個預定義的事件發生的時候,就會被MySQL自動調用。比如對student表進行操作(INSERT、DELETE或UPDATE)時就會激活它執行。

觸發器可以查詢其他表,而且可以包含複雜的SQL語句。它們主要用于滿足複雜的業 務規則或要求。可以建立隻有一條語句的觸發器,不過一般都是有多個執行語句的觸發器用得比較多,即使單條語句的觸發器,也可以使用多條語句的觸發器的寫法 來寫,看下有多個執行語句的觸發器的基本寫法:

CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt      

解釋一下:

1、trigger_name辨別觸發器名稱,使用者自行指定

2、trigger_time辨別觸發時機,可以指定為before或after

3、trigger_event辨別觸發事件,包括INSERT、UPDATE和DELETE

4、tbl_name辨別建立觸發器的表名,即在哪張表上建立觸發器

5、trigger_stmt是觸發器程式體,觸發器程式可以使用begin和end作為開始和結束,中間包含多條語句

觸發器程式可以使用begin和end作為開始和結束,中間包含多條語句。舉個例子,還是以前的學生表:

create table student
(
    studentId            int                 primary key    auto_increment    not null,
    studentName        varchar(10)                                                            not null,
    studentAge        int,
    studentPhone    varchar(15)
)      

給學生表的studentName、studentAge、studentPhone三個字段都建立一個觸發器表:

create table triggerstudentname
(
    t_studentName VARCHAR(10)
);

create table triggerstudentAge
(
    t_studentAge int
);

create table triggerstudentPhone
(
    t_studentPhone VARCHAR(15)
);      

建立一個觸發器,每次插入一條資料之後分别往三張表插字段:

CREATE TRIGGER trigger_student AFTER INSERT ON student
FOR EACH ROW 
BEGIN
    INSERT INTO triggerstudentname values(NEW.studentName);
    INSERT INTO triggerstudentAge values(NEW.studentAge);
    INSERT INTO triggerstudentPhone values(NEW.studentPhone);
END      

插入三條資料:

insert into student values(null,'Jack', '11', '55555555');
insert into student values(null,'Dicky', '14', '66666666');
insert into student values(null,'Coco', '19', '77777777');
commit;      

看一下三張表的情況:

沒什麼問題,執行結果顯示,在向student表插入資料的同時,triggerstudentname、triggerstudentAge和triggerstudentPhone三張表裡面的資料都發生了裱花,INSERT動作觸發了觸發器。

檢視觸發器

檢視觸發器是指檢視資料庫中已存在的觸發器的定義、狀态和文法資訊等。可以通過指令來檢視已經建立的觸發器,有兩種方式可以檢視觸發器,一一講解。

1、SHOW TRIGGERS語句檢視觸發器

通過SHOW TRIGGERS檢視觸發器的語句如下:

SHOW TRIGGERS;
      

用這個指令來檢視一下觸發器:

有一部分沒截取完整,解釋一下主要部分的含義:

(1)Trigger表示觸發器的名稱,這裡有兩個觸發器分别是tri_student和trigger_student

(2)Event表示激活觸發器的事件,這裡的兩個觸發事件為插入操作INSERT

(3)Table表示激活觸發器的操作對象表,這裡都為student表

(4)Statement表示激活觸發器之後執行的語句

(5)Timing表示觸發器觸發的時間,分别為插入操作之前(BEFORE)和插入操作之後(AFTER)

2、在triggers表中檢視觸發器資訊

SHOW TRIGGERS語句檢視目前建立的所有觸發器資訊,這在觸發器較少的情況下,使用該語句會很友善,如果要檢視特定的觸發器資訊,可以直接從infomation_schema資料庫中的triggers表中查找,通過SELECT指令檢視,基本文法為:

SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE condition;
      

比如:

SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = 'trigger_student';
      

可以自己檢視一下指令運作的效果

删除觸發器

使用DROP TRIGGER語句可以删除MySQL中已經定義的觸發器,删除觸發器的基本文法為:

DROP TRIGGER [schema_name.]trigger_name;
      

schema_name表示資料庫名稱,是可選的,如果省略了schema_name,将從目前資料庫中删除觸發器,trigger_name是要删除的觸發器的名稱,比如:

DROP TRIGGER school.tri_student
      

觸發器tri_student删除成功

使用觸發器的注意點

在使用觸發器的時候需要注意:對于相同的表,相同的事件隻能建立一個觸發器。

比如對表student建立了一個BEFORE INSERT觸發器,那麼如果對表student再次建立一個BEFORE INSERT觸發器,MySQL将會報錯,此時,隻可以在表student上建立AFTER INSERT或者BEFORE UPDATE類型的觸發器。靈活地運用觸發器将為操作省去很多麻煩。