觸發器是與表有關的數據庫對象,在知足定義條件時觸發,並執行觸發器中定義的語句集合。數據庫
CREATE [DEFINER = { 'user' | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW [trigger_order] trigger_body
OLD:表示將要刪除的舊行(相似於SQL Server中的DELETED表,只不過前者是行記錄,後者是表)。測試
NEW:表示將要插入的新行(相似於SQL Server中的INSERTED表,只不過前者是行記錄,後者是表)。spa
注:由於是單行記錄,能夠將它們理解爲面嚮對象語言中的對象,直接經過`OLD.字段名`和`NEW.字段名`來使用。code
事件與OLD、NEW的對應關係:對象
由上可見,更新一條記錄,其實是先將原記錄刪除(臨時保存在OLD中),再插入一條新的記錄(臨時保存在NEW中)。blog
1)需求描述:假設有個員工表,若是新入職人員(INSERT)的年齡小於18歲時,自動將其更新爲18歲。事件
2)測試表建立:event
DROP TABLE IF EXISTS EMP1; CREATE TABLE `emp1` ( `ID` int(11) DEFAULT NULL, `NAME` varchar(50) DEFAULT NULL, `AGE` int(11) DEFAULT NULL, KEY `ID_INDEX` (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
3)觸發器建立:table
#當年齡小於18歲時自動更新爲18歲 DELIMITER $$ DROP TRIGGER IF EXISTS triEmp1ForInsert$$ CREATE TRIGGER triEmp1ForInsert BEFORE INSERT ON EMP1 FOR EACH ROW BEGIN IF (NEW.AGE<18) THEN SET NEW.AGE=18; END IF; END$$ DELIMITER ;
4)數據插入:class
INSERT INTO EMP1 VALUES (1,'HELLO',17);
5)結果查詢:
SELECT * FROM EMP1;
6)注意事項:
須要注意的是,MySQL觸發器不容許對自身表進行更新,可是容許更新NEW。
所以,上面的需求假如想經過AFTER INSERT來更改EMP1表,是行不通的。
下面進行錯誤的演示:
#錯誤的演示 DELIMITER $$ DROP TRIGGER IF EXISTS triEmp1ForInsert$$ CREATE TRIGGER triEmp1ForInsert AFTER INSERT ON EMP1 FOR EACH ROW BEGIN IF (NEW.AGE<18) THEN UPDATE EMP1 SET AGE=18 WHERE ID=NEW.ID; END IF; END$$ DELIMITER ;
1)需求描述:假設有兩個表結構同樣的表EMP1和EMP2,若是EMP1有新記錄插入時而EMP2尚未,則將新記錄也插入到EMP2中。
2)測試表建立:
DROP TABLE IF EXISTS EMP1; CREATE TABLE `emp1` ( `ID` int(11) DEFAULT NULL, `NAME` varchar(50) DEFAULT NULL, `AGE` int(11) DEFAULT NULL, KEY `ID_INDEX` (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 DROP TABLE IF EXISTS EMP2; CREATE TABLE `emp2` ( `ID` int(11) DEFAULT NULL, `NAME` varchar(50) DEFAULT NULL, `AGE` int(11) DEFAULT NULL, KEY `ID_INDEX` (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
3)觸發器建立:
#EMP1插入新記錄而EMP2沒有時,將新記錄也插入到EMP2中。 DELIMITER $$ DROP TRIGGER IF EXISTS triEmp1ForInsert$$ CREATE TRIGGER triEmp1ForInsert AFTER INSERT ON EMP1 FOR EACH ROW BEGIN IF NOT EXISTS (SELECT 1 FROM EMP2 WHERE ID=NEW.ID) THEN INSERT INTO EMP2 (ID,`NAME`,AGE) VALUES (NEW.ID,NEW.NAME,NEW.AGE); END IF; END$$ DELIMITER ;
4)數據插入:
INSERT INTO EMP1 VALUES (1,'HELLO',18);
5)結果查詢:
SELECT * FROM EMP2;
#查看當前數據庫全部觸發器 SHOW TRIGGERS; #查看指定數據庫全部觸發器 SHOW TRIGGERS FROM TEST; #查看指定數據庫指定表全部觸發器 SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_OBJECT_SCHEMA='TEST' AND EVENT_OBJECT_TABLE='EMP1';
#直接刪除觸發器 DROP TRIGGER triEmp1ForInsert; #先檢查再刪除觸發器 DROP TRIGGER IF EXISTS triEmp1ForInsert;