MySQL觸發器初試:當A表插入新記錄,自動在B表中插入相同ID的記錄


今天第一次用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 ;

觸發器真是個好東西,自動化的神器啊…… 改天好好再研究研究、發掘發掘~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM