MySQL筆記系列----觸發器

一. 觸發器介紹

用途:當我們希望用戶在使用數據庫時(增刪改查),數據庫會自動執行一些命令,而不是人爲的去敲命令,或者是開發人員在代碼裏寫命令。

場景:我們希望用戶在對錶進行修改時,可以把修改同步到另一張表

實現:假設現有一張表stu1,爲了方便,我們創建另一張表stu2,然後讓stu2的內容始終與stu1的保持同步

創建stu2的SQL

CREATE TABLE stu2 LIKE stu1;

 

二. 創建觸發器

1. 創建觸發器的語法

CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tb_name
FOR EACH ROW
trigger_stmt

注:

trigger_name:觸發器的名稱;

trigger_time:觸發時機,取值爲BEFORE 或者AFTER;

trigger_event:觸發時間,取值爲INSERT, UPDATE或者DELETE;

tb_name:建立觸發器的表名;

FOR EACH ROW:表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器,也就是說觸發器的觸發頻率是針對每一行數據觸發一次。

trigger_stmt:觸發器事件,可以是一條SQL語句,也可以是BEGIN和END包含的多條語句;

2. 創建INSERT型觸發器

例子:創建觸發器,用於向測試表stu1中添加記錄後自動將記錄備份到stu2中。

先將默認的結尾符號;改爲//

DELIMITER //
CREATE TRIGGER afterinsert_on_stu1
AFTER
INSERT ON stu1
FOR EACH ROW
BEGIN
INSERT INTO stu2 (id, name) VALUES (NEW.id, NEW.name);
END //

注:DELIMITER // :因爲數據庫中默認是以分號";"當做結尾的,但是因爲觸發器中也會包含分號,爲了讓數據庫區分,所以這兒使用DELIMITER命令來修改數據庫中結尾的符號爲//

使用完後,也可以使用命令DELIMITER ;改回來,(命令和分號之間是有空格的)

3. 創建DELETE型觸發器

CREATE TRIGGER afterdelete_on_stu1
AFTER
DELETE ON stu1
FOR EACH ROW
BEGIN 
DELETE FROM stu2 WHERE id=OLD.id;
END //

注:mysql中定義了NEW和OLD來表示觸發器所在表中觸發了觸發器的哪一行

  • 在INSERT型觸發器中,NEW用來表示將要(BEFORE)或已經(AFTER)插入的新數據
  • 在UPDATE型觸發器中,OLD用來表示將要或者已經被修改的原數據,NEW用來表示將要或已經被修改的新數據
  • 在DELETE型觸發器中,OLD用來表示將要或已經被修改的原數據

NEW關鍵字的用法:NEW.columnName,OLD用法類似

OLD是隻讀的,而NEW可以在觸發器中使用SET賦值,這樣就不會再次觸發觸發器了。

 

三. 查看觸發器

1. 使用SHOW TRIGGERS查看

這是我之前在其他表中創建的INSERT和DELETE觸發器

2. 在information_schema.triggers表中查看觸發器

information_schema是mysql數據庫默認就創建的一個數據庫,triggers是該數據庫下的一張表

查看

SELECT * FROM information_schema.triggers
WHERE trigger_name='afterinsert_on_stu1'\G

 

四. 使用觸發器

執行順序:觸發器的執行順序依次是BEFORE觸發器、行操作、AFTER,過程中出錯的話,將不會執行後面的操作,事務表出錯可以回滾,非事務表不能回滾。

 

五. 刪除觸發器

語法:

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

IF EXISTS是可選參數,加了這個參數,如果要刪除的觸發器不存在的話,那麼不會報錯,而是返回一個警告

例如:刪除數據表stu1中的DELETE觸發器

DROP TRIGGER stu1.afterdelete_on_stu1;

下面是刪除某個不存在的觸發器時,使用IF EXISTS和不使用的區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章