1.概念:觸發器是mysql響應insert、update、delete語句時自動執行的一條SQL語句。mysql
- #1.建立兩個測試表
- USE mydb;
- #表1:t_tableA
- CREATE TABLE t_tableA(
- id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
- val VARCHAR(20)
- );
- #表2:t_tableB
- CREATE TABLE t_tableB(
- id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
- val VARCHAR(20)
- );
- #2.建立insert後置觸發器
- CREATE TRIGGER tr_insert_tableA /*tr_insert_tableA是觸發器的名稱*/
- AFTER INSERT ON t_tableA /*一個後置在t_tableA表上的insert的觸發器*/
- FOR EACH ROW /*對全部代碼行都執行*/
- INSERT INTO t_tableB(val) VALUES(new.val); /*觸發器的內容,將
- a表中插入的數據放到b表中一份,insert觸發器會訪問一個名稱爲new的虛擬表,獲取剛插入的值*/
- /*測試一下上面的insert後置觸發器*/
- INSERT INTO t_tableA(val) VALUES('ok');
- /*
- 說明:
- ①在insert觸發器內,可引用一個名爲new的虛擬表,訪問被插入的行
- ②在beforeInsert觸發器中,new中的值也能夠被更新(運行更改被插入的值)
- ③對於自動增加列,new在insert執行以前的值爲0,在執行以後是新的自動生成的值
- */
- #第二個觸發器:得到剛剛插入的自動生成的主鍵值 (注意:你應該把上面的一個觸發器刪掉再建立這個啊!!)
- CREATE TRIGGER t_insert_pk_tableA
- AFTER INSERT ON t_tableA
- FOR EACH ROW
- SELECT new.id INTO @id;
- /*測試一下*/
- INSERT INTO t_tableA(val) VALUES('no');
- SELECT @id;
- eg.建立一個觸發器,將a表中修改後的名字都更改成大寫!!
- DELIMITER //
- CREATE TRIGGER t_update_tableA
- BEFORE UPDATE ON t_tableA
- FOR EACH ROW
- BEGIN
- SET new.val = UPPER(new.val); /*so important!!*/
- END //
- DELIMITER ;
- 測試一下上面的觸發器:
- UPDATE t_tableA SET val='xyz' WHERE id=1;
- /*把從a表刪除的數據,插入到b表中,能夠做爲備份用!*/
- DELIMITER //
- CREATE TRIGGER t_delete_tableA
- AFTER DELETE ON t_tableA
- FOR EACH ROW
- BEGIN
- INSERT INTO t_tableB(val) VALUES(old.val);
- END //
- DELIMITER ;
- /*測試一把:*/
- DELETE FROM t_tableA WHERE id=1;