1、觸發器概念
- MySQL 從 5.0.2版本開始支持觸發器的功能。
- 通俗的理解觸發器就是,操作人員對數據庫表進行操作時,滿足了觸發的條件,就會執行觸發器里面特定的語句。
- 等式理解:觸發器 = sql + 控制結構
比如學生表(stu)進行操作新增的時后,日志表(logs)需要記錄。不用觸發器就是我們在后台持久層中新增記錄日志;使用觸發器后,當學生表新增時,就可以自動執行里面的語句,記錄日志。
2、創建觸發器
基本語法
CREATE TRIGGER 觸發器名稱 trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
-- trigger_time 觸發器時間
-- trigger_event 觸發事件
-- tbl_name 觸發表名稱
-- trigger_stmt 觸發后執行的語句
trigger_event 觸發事件
觸發事件取值為 INSERT,UPDATE,DELETE
- INSERT:插入觸發事件,能通過 INSERT、LOAD DATA、REPLACE 語句觸發;
- UPDATE:更新觸發事件,能通過 UPDATE 語句觸發;
- DELETE:刪除觸發事件,能通過 DELETE、REPLACE 語句觸發。
應為Mysql因為還定義了LOAD DATA 和 REPLACE 語句,INSERT觸發事件也支持這兩種語句。若不明白這兩種語句,自行百度。
trigger_stmt 觸發執行語句
trigger_stmt 使用BEGIN END語句塊
-- demo 當觸發器執行語句塊,就會向日志表插入一條自定義數據
BEGIN
DECLARE rs; -- 定義數據
set re = "記錄日志信息" -- 設置數據
insert into logs(log_info) value(re);
END
NEW、OLD關鍵字
這里只給了含義,詳細看后面的舉例,一目了然
- NEW.columnName (獲取INSERT觸發事件中新插入的數據)
- OLD.columnName (獲取UPDATE和DELETE 觸發事件中更新、刪除的數據)
trigger_event 觸發器時間
trigger_time是觸發程序的動作時間。它可以是BEFORE或AFTER,以指明觸發程序是在激活它的語句之前或之后觸發。觸發事件可選項為before,after。
- after:就是增刪改完成之后,執行觸發器
- before:就是增刪改完成之前,執行觸發器
具體有什么區別呢
觸發器功能舉例:比如加班表,超過8小時全部按照8小時。
-- 創建觸發器 觸發事件選擇before
-- DELIMITER是分隔符,因為 Mysql里面是用‘;’結束的,觸發器的分行是‘;’,沖突了,所以分隔符
DELIMITER $
CREATE TRIGGER insert_ot_tig before INSERT on overtime for each row
BEGIN
-- new.time就獲取了time的這個數據
if new.time>8 THEN
set new.time=8;
end if;
END $
DELIMITER;
-- 插入數據
insert into overtime(name,time) values('james',19);
結果如圖
如果before是在觸發器時間選擇after,創建觸發器就會報錯,翻譯過來就是觸發器不允許NEW更新,其實就是如果是after,就是insert已經結束才運行觸發器,理解為你數據都插入了,還要我做什么。
小結
-- 創建觸發器
CREATE TRIGGER 觸發器名 BEFORE|AFTER
insert|update|delete ON 觸發表名
FOR EACH ROW
BEGIN
執行語句列表
END
Demo
就日志表和學生表,學生表插入的時候自動記錄日志
-- 創建觸發器
DELIMITER $
CREATE TRIGGER stu_logs after INSERT on stu for each row
BEGIN
DECLARE logInfo VARCHAR(100);
set logInfo = CONCAT(new.name,'創建成功,所屬班級為',new.class); -- CONCAT拼接函數
insert into logs(log_info,log_time) VALUES(logInfo,CURRENT_TIMESTAMP);-- CURRENT_TIMESTAMP 獲取時間
END $
DELIMITER;
-- 執行插入學生 sql
insert into stu(name,age,class) VALUES('張三',14,'2018級6班')
結果如下:
插入學生張三的時候,觸發器執行,向日志表自動添加日志
3、查看觸發器
- sql語句
show triggers
- 觸發器存放位置
安裝Mysql后,在information_schema數據庫中有個表叫TRIGGERS,存放Mysql的觸發器
4.刪除觸發器
與刪除表的語法一樣
drop trigger 觸發器名
5、觸發器錯誤與sql回滾
不論觸發器是before類型還是after類型,如果觸發器執行執行失敗,那么sql語句是否會正常執行,如何sql執行失敗,觸發器又如何執行呢?
- before 類型,在sql語句執行之前,如果觸發器錯誤,sql直接不執行
- after 類型,在sql語句之后,如何sql執行成功,觸發器失敗,sql回滾;如何sql失敗,觸發器直接不執行。
小結
sql與觸發器一方存在問題,整個流程全部失敗,數據與執行一樣,保證事務的原子性。
6、結束語
莫失精誠赤子心