MySQL觸發器詳解

觸發器是與 MySQL 數據表有關的數據庫對象,在滿足定義條件時觸發,並執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在數據庫端確保數據的完整性。
那麼爲什麼要使用數據庫對象觸發器呢?在具體開發項目時,經常會遇到如下實例:
<1> 在學生表中擁有字段學生姓名,字段學生總數,每當添加一條學生信息時,學生的總數就必須同時更改。
<2> 在學生表中還會有學生姓名的縮寫,學生住址等字段,添加學生信息時,往往需要檢查電話、郵箱等格式是否正確。
上面的例子使用觸發器完成時具有這樣的特點,需要在表發生改變時,自動進行一些處理。MySQL在觸發DELETE/UPDATE/INSERT語句時就會自動執行所設置的操作,其他SQL語句則不會激活觸發器。

創建觸發器

創建觸發器的語法:
create trigger trigger_name
trigger_time trigger_event
on tbl_name for each row
begin
sql語句;
end;

trigger_name:觸發器的名稱,觸發器在當前數據庫中必須具有唯一的名稱。
trigger_time:{ BEFORE | AFTER },表示在事件之前或之後觸發;
trigger_event:{ INSERT |UPDATE |DELETE },觸發該觸發器的具體事件;
tbl_name:該觸發器作用在tbl_name上;
for each row:是操作語句每影響到一行的時候就觸發一次,也就是刪了 10 行就觸發 10 次

實例

example1:
創建表tab1

DROP TABLE IF EXISTS tab1;
CREATE TABLE tab1(
    tab1_id varchar(11)
);

創建表tab2

DROP TABLE IF EXISTS tab2;
CREATE TABLE tab2(
    tab2_id varchar(11)
);

創建觸發器:t_afterInsert_on_tab1
作用:增加tab1表記錄後自動將記錄增加到tab2表中

DROP TRIGGER IF EXISTS t_afterinsert_on_tab1;
CREATE TRIGGER t_afterInsert_on_tab1 
AFTER INSERT ON tab1
FOR EACH ROW
BEGIN
     insert into tab2(tab2_id) values(new.tab1_id);
END;

測試:

INSERT INTO tab1(tab1_id) values('0001');

結果

SELECT * FROM tab1;
SELECT * FROM tab2;

example2:
創建觸發器:t_afterDelete_on_tab1
作用:刪除tab1表記錄後自動將tab2表中對應的記錄刪去

DROP TRIGGER IF EXISTS t_afterDelete_on_tab1;
CREATE TRIGGER t_afterdelete_on_tab1
AFTER DELETE ON tab1
FOR EACH ROW
BEGIN
      delete from tab2 where tab2_id=old.tab1_id;
END;

測試

DELETE FROM tab1 WHERE tab1_id='0001';

結果

SELECT * FROM tab1;
SELECT * FROM tab2;

實例說明

看了上面兩個實例,你可能對new和old這兩個變量感到疑惑和SQL Server 中的 INSERTED 和 DELETED 類似,MySQL 中定義了 NEW 和 OLD,用來表示觸發器的所在表中,觸發了觸發器的那一行數據。
具體地:
在 INSERT 型觸發器中,NEW 用來表示將要(BEFORE)或已經(AFTER)插入的新數據;
在 UPDATE 型觸發器中,OLD 用來表示將要或已經被修改的原數據,NEW 用來表示將要或已經修改爲的新數據;
在 DELETE 型觸發器中,OLD 用來表示將要或已經被刪除的原數據;
使用方法: NEW.columnName (columnName 爲相應數據表某一列名)
另外,OLD 是隻讀的,而 NEW 則可以在觸發器中使用 SET 賦值,這樣不會再次觸發觸發器,造成循環調用(如每插入一個學生前,都在其學號前加“2016”)。

定義變量

MySQL 中使用 DECLARE 來定義一局部變量,該變量只能在 BEGIN … END 複合語句中使用,並且應該定義在複合語句的開頭,

即其它語句之前,語法如下:
DECLARE var_name[,…] type [DEFAULT value]
其中:
var_name 爲變量名稱,同 SQL 語句一樣,變量名不區分大小寫;type 爲 MySQL 支持的任何數據類型;可以同時定義多個同類型的變量,用逗號隔開;變量初始值爲 NULL,如果需要,可以使用 DEFAULT 子句提供默認值,值可以被指定爲一個表達式。

對變量賦值採用 SET 語句,語法爲:
SET var_name = expr [,var_name = expr] …

管理觸發器

1查看觸發器
(1).查看數據庫中所有的觸發器

SHOW TRIGGERS [FROM schema_name];

其中,schema_name 即 Schema 的名稱
刪除觸發器
和刪除數據庫、刪除表格一樣,刪除觸發器的語法如下:

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
發佈了18 篇原創文章 · 獲贊 4 · 訪問量 7407
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章