一. 觸發器介紹
用途:當我們希望用戶在使用數據庫時(增刪改查),數據庫會自動執行一些命令,而不是人爲的去敲命令,或者是開發人員在代碼裏寫命令。
場景:我們希望用戶在對錶進行修改時,可以把修改同步到另一張表
實現:假設現有一張表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和不使用的區別