Mysql 觸發器


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小時。

image

-- 創建觸發器 觸發事件選擇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);

結果如圖

image

如果before是在觸發器時間選擇after,創建觸發器就會報錯,翻譯過來就是觸發器不允許NEW更新,其實就是如果是after,就是insert已經結束才運行觸發器,理解為你數據都插入了,還要我做什么。

image

小結
-- 創建觸發器
CREATE TRIGGER 觸發器名 BEFORE|AFTER  
insert|update|delete ON 觸發表名 
FOR EACH ROW 
BEGIN
    執行語句列表
END

Demo

就日志表和學生表,學生表插入的時候自動記錄日志

image

-- 創建觸發器
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班')

結果如下:
插入學生張三的時候,觸發器執行,向日志表自動添加日志

image

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、結束語

莫失精誠赤子心

博客出處 : https://www.cnblogs.com/augusduan/p/9187890.html


免責聲明!

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



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