MySQL 觸發器

 

建立觸發器javascript

在建立觸發器時,須要給出 4條信息:java

        一、惟一的觸發器名;
        二、觸發器關聯的表
        三、觸發器應該響應的動做( DELETEINSERT UPDATE
        四、觸發器什麼時候執行(處理以前或以後)。
 
  注意:只有表才支持觸發器,視圖不支持(臨時表也不支持)。
    觸發器按每一個表每一個事件每次地定義,每一個表每一個事件每次只容許一個觸發器。所以,每一個表最多支持 6個觸發器(每條INSERT、 UPDATEDELETE的以前和以後)。單一觸發器不能與多個事件或多個表關聯,所以,若是你須要一個對 INSERTUPDATE 操做執行的觸發器,則應該定義兩個觸發器。
  注意:若是BEFORE觸發器失敗,則 MySQL將不執行請求的操做。此外,若是 BEFORE觸發器或語句自己失敗, MySQL將不執行 AFTER觸發器(若是有的話)。
 
 觸發器 能夠 使用BEGIN 和END 語句標記觸發器體。但不是必需的。使用 BEGIN END 塊的好處是觸發器能容納多條語句。

 

INSERT觸發器

 

    INSERT觸發器在INSERT 語句執行以前或以後執行。須要知道如下幾點:

 

        一、INSERT觸發器代碼內,可引用一個名爲 NEW的虛擬表,訪問被插入的行。

 

        二、BEFORE INSERT觸發器中, NEW中的值也能夠被更新(容許更改被插入的值);

 

        三、對於 AUTO_INCREMENT列,NEW INSERT執行以前包含 0,在INSERT執行以後包含新的自動生成值。

 

 

drop trigger if exists test_trigger;  ##刪除觸發器
delimiter//  ##改變語句分割符
create trigger test_trigger after insert on aaa_test    ##建立觸發器test_trigger,當表aaa_test插入數據後執行
for each row    ##FOR EACH ROW是觸發器的執行間隔,FOR EACH ROW子句通知觸發器每隔一行執行一次動做,而不是對整個表執行一次
begin
    select new.id into @aaa;    ##將aaa_test表中id列的最新的值保存到用戶變量@aaa中
end//

往表aaa_test中插入一行數據:spa

INSERT INTO aaa_test(username,PASSWORD,birthday) VALUES('test_trigger','12345',CURRENT_DATE);

此時表aaa_test中的結果:code

 

查看標量@aaa的結果,執行 :  "SELECT @aaa",其結果等於最新id值blog

 

 

DELETE觸發器
    DELETE 觸發器在DELETE 語句執行以前或以後執行。須要知道如下兩點:
        一、 DELETE觸發器代碼內,你能夠引用一個名爲 OLD 的虛擬表,訪問被刪除的行;
        二、OLD 中的值全都是隻讀的,不能更新。

 

DROP TRIGGER IF EXISTS test_delete_trigger_before;
DELIMITER//
CREATE TRIGGER test_delete_trigger_before BEFORE DELETE ON aaa_test FOR EACH ROW
BEGIN
    SELECT old.id INTO @bbb;   ##將要刪除數據行的id值保存到變量@bbb中
END//

刪除以前aaa_test表中數據爲:事件

刪除id=48的記錄,執行:ip

DELETE FROM aaa_test WHERE id=48;

查看變量@bbb,執行:it

SELECT @bbb;

 其結果爲48:class

 

UPDATE觸發器
    UPDATE 觸發器在UPDATE 語句執行以前或以後執行。須要知道如下幾點:
        一、 UPDATE觸發器代碼中,你能夠引用一個名爲 OLD 的虛擬表訪問之前( UPDATE 語句前)的值,引用一個名爲 NEW 的虛擬表訪問新更新的值;
        二、 BEFORE UPDATE觸發器中, NEW 中的值可能也被更新(容許更改將要用於 UPDATE 語句中的值);
        三、OLD 中的值全都是隻讀的,不能更新。

 

DROP TRIGGER IF EXISTS test_update_trigger_before;
DELIMITER//
CREATE TRIGGER test_update_trigger_before BEFORE UPDATE ON aaa_test
FOR EACH ROW
BEGIN
    SELECT UPPER(old.password) INTO @ccc;  ##將修改以前的值保存到@ccc變量中
    SELECT LOWER(new.password ) INTO @ddd;  ##將修改後的新值保存到@ddd變量中
END//

修改密碼以前:test

修改密碼:

update  aaa_test set password='helloWorld' where id=49;

變量@ccc結果爲修改以前的值:

SELECT @ccc;

 

變量@ddd結果爲修改後的值:

SELECT @ddd;

 

 

    【注】: MySQL 觸發器中不支持 CALL語句。這表示不能從觸發器內調用存儲過程。所需的存儲過程代碼須要複製到觸發器內。
 
    關於何時使用new,old這兩個關鍵字就好像字面意思新舊同樣:
         INSERT 只有NEW
         UPDATE既有NEW又和OLD
         DELETE只有OLD 
    因此對於INSERT語句,只有NEW是合法的;對於DELETE語句,只有OLD才合法;而UPDATE語句能夠在和NEW以及 OLD同時使用
相關文章
相關標籤/搜索