MySQL學習筆記十一:觸發器

1、觸發器概念

觸發器是與表有關的數據庫對象,在知足定義條件時觸發,並執行觸發器中定義的語句集合。數據庫

2、觸發器建立

2.一、建立語法

CREATE [DEFINER = { 'user' | CURRENT_USER }] 
TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
[trigger_order]
trigger_body

2.二、建立語法關鍵詞解釋

2.三、觸發執行內容OLD與NEW

OLD:表示將要刪除的舊行(相似於SQL Server中的DELETED表,只不過前者是行記錄,後者是表)。測試

NEW:表示將要插入的新行(相似於SQL Server中的INSERTED表,只不過前者是行記錄,後者是表)。spa

注:由於是單行記錄,能夠將它們理解爲面嚮對象語言中的對象,直接經過`OLD.字段名`和`NEW.字段名`來使用。code

事件與OLD、NEW的對應關係:對象

由上可見,更新一條記錄,其實是先將原記錄刪除(臨時保存在OLD中),再插入一條新的記錄(臨時保存在NEW中)。blog

3、觸發器示例

3.一、觸發自身表

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 ;

3.二、觸發其它表

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;

4、觸發器查看

#查看當前數據庫全部觸發器
SHOW TRIGGERS;
 
#查看指定數據庫全部觸發器
SHOW TRIGGERS FROM TEST;

#查看指定數據庫指定表全部觸發器
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_OBJECT_SCHEMA='TEST' AND EVENT_OBJECT_TABLE='EMP1';

5、觸發器刪除

#直接刪除觸發器
DROP TRIGGER triEmp1ForInsert;

#先檢查再刪除觸發器
DROP TRIGGER IF EXISTS triEmp1ForInsert;
相關文章
相關標籤/搜索