今天第一次用MySQL的觸發器,怕忘了,趕緊寫篇博客記錄一下。
廢話不說,先上語法:
1 CREATE TRIGGER trigger_name 2 { BEFORE | AFTER } { INSERT | UPDATE | DELETE } 3 ON tbl_name 4 FOR EACH ROW 5 trigger_body
事情的起因是這樣的:我有一個人員信息表 pers。因為字段很多,就把中文字段單出來,另建了一個表 perscn。我希望當 pers 插入一條記錄,perscn 也能自動插入一條記錄,這樣就能保證兩張表的記錄一一對應。MySQL中的觸發器正好滿足這個需求。不過也是研究了半天才最終搞定。
先上代碼:
1 CREATE TRIGGER t_pers_perscn 2 AFTER INSERT ON pers 3 FOR EACH ROW 4 INSERT INTO perscn(pid, sname, oname, unic) VALUES( 5 (SELECT MAX(pid) FROM pers), 6 (SELECT sname FROM pers ORDER BY pid DESC LIMIT 1), 7 (SELECT oname FROM pers ORDER BY pid DESC LIMIT 1), 8 (SELECT unic FROM pers ORDER BY pid DESC LIMIT 1) 9 );
以上代碼大致是說:
1 創建觸發器 t_pers_perscn
2 在 pers 插入新記錄之后
3 對於每一條記錄
4 往 perscn 插入一條記錄,包含 4 個字段,值分別是(
5 (pid),
6 (sname),
7 (oname),
8 (unic)
9 );
因為需要獲取 pers 表中插入記錄的 ID(本表中字段名為 pid),一開始想着用 LAST_INSERT_ID(),行不通。后來想到 MAX(),倒是能獲得最新插入的 pid 值,但 perscn 中的其它值卻不能用 SELECT sname FROM pers WHERE pid = MAX(pid); 來獲取,看來在 WHERE 語句中是不能用 MAX() 函數吧…… 最后只能用笨辦法,先對 pid 進行降序排列,然后用 LIMIT 限制 1 條記錄,這樣倒是也能獲得與 MAX() 函數相同的效果。沒辦法,就是這么笨……
回到最上面的語法,大致意思是:
1 CREATE TRIGGER 觸發器名稱
2 在 INSERT、UPDATE或DELETE動作之前或之后
3 ON 上述動作所作用的表
4 FOR EACH ROW(規定語句,照抄吧)
5 以上動作所觸發的SQL語句(即正常SQL操作語句)
其中,第5步的 trigger_body 一般只能寫一行。如果有多條操作語句,則需要先用 DELIMITER 暫時更改下語句結束符,然后用 BEGIN...END... 語句來寫操作語句(因為BEGIN...END...里必須用半角分號 “;” 來標識一行語句的結束,所以才需要用 DELIMITER)。關於更改 DELIMITER,請見官方文檔的示例:
1 mysql> delimiter // 2 mysql> CREATE PROCEDURE dorepeat(p1 INT) 3 -> BEGIN 4 -> SET @x = 0; 5 -> REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; 6 -> END 7 -> // 8 Query OK, 0 rows affected (0.00 sec) 9 mysql> delimiter ;
觸發器真是個好東西,自動化的神器啊…… 改天好好再研究研究、發掘發掘~~~