【數據庫】MySQL觸發器

觸發器


Level 1

用途

通過監視某種數據庫操作,根據該數據庫操作觸發其他操作的執行。

優點

  1. SQL語句中觸發器默認爲一個事務操作,具有原子性,可以綁定用戶輸入和觸發的兩個sql語句。
  2. 保證數據的完整性,約束數據庫中的數據。
  3. 可以利用數據庫語言來進行業務邏輯的構建。

缺點

  1. 使程序更爲複雜。
  2. 分擔了後端業務邏輯處理的功能,增加了耦合。
  3. 某些業務邏輯後期難以維護。

Level 2

創建語法四要素

  1. 監視地點:指定觸發器所在的表。
  2. 監視事件:設置需要監控的動作,增加(INSERT),更新(UPDATE),刪除(DELETE)。
  3. 觸發順序:觸發的SQL語句執行在輸入的SQL語句之前(BEFORE),之後(AFTER)。
  4. 觸發事件:自定義的SQL語句。

Level 3

觸發器工作流程

數據庫中存在Table-1,Table-2兩個表;
對Table-1操作的Sql-1語句,對Table-2操作的Sql-2語句;
Sql-1語句可以觸發Sql-2語句。

當用戶輸入or調用Sql-1語句時;流程如下所示:

  1. 操作被監控所獲取,進行判斷;
  2. 若觸發順序標識爲before,則先執行被觸發的Sql-2語句(2-2);再執行Sql-1語句(2-1)。
  3. 若觸發順序標識爲after,則先執行Sql-1語句(2-1);再執行Sql-2語句(2-2)。

在這裏插入圖片描述


Level 4

觸發器實例

業務背景:

有一個機構,機構中有若干學生,機構有官網,
想讓每個新加入的學生,自動獲取一個登陸賬號and密碼

設置:
  1. 創建學生表(student),創建用戶表(user)。
  2. 創建在學生表上創建觸發器(insert_user)。
  3. 向學生表中新增數據,檢測結果。
########################################################################CREATE-TABLE
DROP TABLE IF EXISTS `student`;						##	若學生表存在,清空該信息
CREATE TABLE `student`(								##	創建學生表
`id` int(30) NOT NULL AUTO_INCREMENT,				##		id 			字段設置
`name` varchar(255) DEFAULT NULL,					##		name		字段設置
`description` varchar(255) DEFAULT NULL,			##		description 字段設置
PRIMARY KEY(`id`) 									##					主鍵設置
)ENGINE = InnoDB DEFAULT CHARSET=UTF8;				##					其他設置

DROP TABLE IF EXISTS `user`;						##	若用戶表存在,清空該表信息
CREATE TABLE `user` (								##	創建用戶表
`id` int(20) NOT NULL AUTO_INCREMENT,				##		id			字段設置
`student_id` int(20) NOT NULL,						##		student_id	字段設置
`username` varchar(255) NOT NULL,					##		username	字段設置
`password` varchar(255) NOT NULL,					##		password	字段設置
PRIMARY KEY(`id`)									##					主鍵設置
)ENGINE = InnoDB DEFAULT CHARSET=UTF8;				##					其他設置
########################################################################CREATE-TABLE
######################################################################CREATE-TRIGGER
DROP TRIGGER IF EXISTS `insert_user`;				##	若該觸發器存在,則清空	
DELIMITER $$										##	更改語句結束符爲 $$
CREATE TRIGGER `insert_user`						##	創建觸發器 insert_user
AFTER 												##	設置觸發器	觸發順序
INSERT												##	設置觸發器	監視事件
ON `student`										##	設置觸發器	監視地點
FOR EACH ROW										##		表示:每一行觸發一次
########################################	TRIGGER 觸發的SQL語句
BEGIN												##	開始
INSERT INTO 										##	設置觸發器	觸發事件
`user`												##	設置觸發器	觸發事件
(student_id,username,password)						##	設置觸發器	觸發事件
VALUES												##	設置觸發器	觸發事件
(new.id,new.name,'123456');							##	設置觸發器	觸發事件
END													##	結束
########################################	TRIGGER 觸發的SQL語句
$$													##	語句結束
DELIMITER ;											##	語句結束符設回分號(;)
######################################################################CREATE-TRIGGER
######################################################################INSERT DATA
INSERT INTO `student` 
(name,description)
VALUES
('HOUKE','KEKE');
######################################################################INSERT DATA

實施插入操作完成後,可發現,
除了輸入的sql語句生效外(student表中數據新增);
觸發器中執行的sql語句同樣生效了(user表中數據同步更新);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章