筆者是SQL初學者,由於在日常工作中使用Excel處理數據時感覺有很多方面非常不便,現在正在學習使用Navicat來操作MySQL數據庫來更好地解決實際工作中的問題,歡迎一起交流討論。
現有一張考勤表“kaoqin”,如下:
此時我想刪除表中的一條記錄之前,自動將要刪除的這條記錄添加到另一個表“kaoqin_copy1”中:
此時我們將要用到mysql中的觸發器:
觸發器的特性:
1、有begin end體,begin end;之間的語句可以寫的簡單或者複雜
2、什麼條件會觸發:I、D、U
3、什麼時候觸發:在增刪改前或者後
4、觸發頻率:針對每一行執行
5、觸發器定義在表上,附着在表上。
也就是由事件來觸發某個操作,事件包括INSERT語句,UPDATE語句和DELETE語句;可以協助應用在數據庫端確保數據的完整性。
觸發器的語法:
delimiter 自定義結束符號 create trigger 觸發器名字 觸發時間 觸發事件 on 表 for each row begin -- 觸發器內容主體,每行用分號結尾 end 自定義的結束符合 delimiter ;
那此時在Navicat中應該如何使用觸發器來實現這一操作呢?
按上圖步驟為kaoqin表添加名為tr1的觸發器,觸發器內容主體如下:
INSERT INTO kaoqin_copy1(`序號`, `姓名`, `文件名稱`, `文件描述`, `時長H`, `備註`)
VALUES (OLD.`序號`, OLD.`姓名`, OLD.`文件名稱`, OLD.`文件描述`, OLD.`時長H`, OLD.`備註`);
此時的OLD表示將要刪掉的原數據
最後來看一下效果,刪除kaoqin表中序號為330的數據
返回查看kaoqin_copy1表中出現了剛才刪除的數據
2022.08.31完善內容:稍微複雜一點的觸發器
現在我們在觸發器主體語句中加入一些業務邏輯,而不是僅僅將記錄轉移到另一張表
同樣是一張考勤表“kaoqin”:
現在需要每當插入一條“請假單”數據後,在另一張表“kaoqin_copy2”中生成請假單編號
在考勤表kaoqin中添加以下觸發器
BEGIN
IF
( NEW.`文件名稱` = '請假單' ) THEN
INSERT INTO kaoqin_copy2 ( `序號`, `姓名`, `文件名稱`, `文件描述`, `時長H`, `請假單編號` )
VALUES
(
NEW.`序號`,
NEW.`姓名`,
NEW.`文件名稱`,
NEW.`文件描述`,
NEW.`時長H`,
CASE
WHEN NEW.time THEN
CONCAT(
'QJ',
SUBSTRING( NEW.time, 1, 4 ),
MID( NEW.time, 6, 2 ),
MID( NEW.time, 9, 2 ),
RIGHT ( NEW.time, 5 )
)
END
);
END IF;
END
插入一條請假單數據測試一下:
INSERT INTO kaoqin (`序號`,`姓名`,`文件名稱`,`文件描述`,`時長H`) VALUES (3,'CC','請假單','漏打卡',2)
kaoqin_copy2表自動生成了編號
半年多時間過去,筆者已經從初學者順利入門了,本篇博客作為我半年多來閲讀量最高的一篇,非常驚喜,今天終於抽出時間把半年前挖的坑(説要完善本博客的)給填上了,希望對剛入門的SQL新手和Navicat初學者帶來一些幫助,本文章對觸發器的介紹就到這裏,實際業務場景的觸發器還有更多的應用方式且有的會複雜得多,希望各位接下來能在實踐中去靈活運用觸發器。