觸發器的作用
監聽數據的變化,以實現當數據變化時的關聯操作,不過感覺沒有實際作用,觸發器的功能如果用代碼邏輯來控制感覺會更正規些,畢竟團隊中的其它人不一定會看到你定義的觸發器,但一定能看到你的代碼。那爲何還要學習觸發器,有些知識不是爲自己學的,你不用,你不敢保證別人不用。如果別人用了,我們對此一無所知,那麼會給程序的維護帶來很大的困難。
觸發器的定義
格式:create trigger 觸發器名稱 事件 on 表名 執行代碼
事件:
- 插入 insert
- 刪除 delete
- 修改 update
時機:
- 前 before
- 後 after
事件與時機組合共有六種情況
- before insert
- after insert
- before delete
- after delete
- before update
- after update
創建語法
delimeter $ // 修改語句結束符,避免和定義trigger中的語句衝突
create trigger triggerName
after/before insert/update/delete on 表名
for each row // 這一行是固定的
begin
sql語句 // 一條或多條sql語句,一條sql語句也可省略begin 和 end
end;
delimeter ; // 改回正常的結束符
new / old
如果在trigger內部需要使用觸發trigger那行記錄中的值,那麼new代表新行,old代表舊行。也就是說 old / new 分別代表事件發生 前 / 後該行記錄。是一整行,而不是某個字段。
*注意: insert 操作沒有old,delete 操作沒有new
觸發器的管理
刪除
drop trigger trigger_name
查看所有觸發器
show triggers;
示例
假設我們有一張班級表
id | class_name | num |
---|---|---|
1 | 001 | 1 |
2 | 002 | 1 |
3 | 003 | 0 |
還有一張學生表
id | name | class_id |
---|---|---|
1 | xiaohong | 1 |
2 | xiaogang | 2 |
我們定義一個觸發器,每當增加一名學生,對應班級表中的學生數量num就加一。
delimiter $$
create trigger zhaosheng after insert on student
for each row
begin
update class set num=num+1 where id=new.class_id;
end;
$$
delimiter ;
看效果:
當增加一個學生zhangsan後,calss表中對應的id爲3的num自動增加1。