MySQL深入淺出掌握觸發器用法
MySQL觸發器
觸發器是一種特殊的存儲過程,觸發器和存儲過程一樣是一個能完成特定功能、存儲在數據庫服務器上的SQL片段,但是觸發器無需調用,當對數據庫表中的數據執行DML操作時自動觸發這個SQL片段的執行,無需手動調用.
在MySQL中,隻要執行insert,update,delete操作是才能觸發觸發器的執行
觸發器的這種特性可以協助應用在數據庫端確保數據的完整性,日志記錄,數據校驗等操作.
使用別名OLD和NEW來引用觸發器中發生變化的記錄內容,這與其他的數據庫是相似的,現在觸發器還值支持行級觸發,不支持語句級觸發.
觸發器的特性
① 什麼條件會觸發: insert,delete,update
② 什麼時候觸發: 在增刪改前或者後
③ 觸發頻率: 針對每一行執行
④ 觸發器定義在表上,附著在表上
創建觸發器
— 創建隻有一個執行語句的觸發器
格式:
create trigger 觸發器名 before|after 觸發事件
on 表名 for each row
執行語句;— 創建有多個執行語句的觸發器
格式:
create trigger 觸發器名 before|after 觸發事件
on 表名 for each row
begin
執行語句列表
end;
demo
— 需求:當user表添加一行數據,則會自動在user_log添加日志記錄
delimiter $$ create trigger trigger_test after insert on user for each row begin insert into user_logs values(1,now,'有新用戶增加'); end $$ delimiter;
觸發器操作-NEW和OLD
mysql中定義瞭new和old,用來表示觸發器的所在表中,觸發瞭觸發器的哪一行數據,來引用觸發器中發生變化的記錄內容,具體如下
觸發器類型 | 觸發器類型NEW和OLD的使用 |
---|---|
INSERT 型觸發器 | NEW 表示將要或者已經新增的數據 |
UPDATE 型觸發器 | OLD 表示修改之前的數據,NEW表示將要或者已經修改後的數據 |
DELETE 型觸發器 | OLD 表示將要或者已經刪除的數據 |
使用方法: NEW.columnName(columnName為相應數據表某一列名)
demo
-- insert delimiter && create trigger test1 after insert on user for each row begin insert into user_logs values(1,now,concat('有新用戶增加,信息為',NEW.uid,NEW.username,NEW.password)); end $$ delimiter; -- update delimiter && create trigger test2 after update on user for each row begin insert into user_logs values(1,now,concat('修改用戶,之前信息為',OLD.uid,OLD.username,OLD.password,'修改之後的信息為',NEW.uid,NEW.username,NEW.password)); end $$ delimiter; -- delete delimiter && create trigger test3 after delete on user for each row begin insert into user_logs values(1,now,concat('有用戶刪除,信息為',OLD.uid,OLD.username,OLD.password)); end $$ delimiter;
觸發器-查看
show triggers;
觸發器-刪除
drop trigger if exists trigger_test;
觸發器的註意事項
① MYSQL中觸發器中不能對本表進行insert,update,delete操作,以免遞歸循環觸發
② 盡量少使用觸發器,假設觸發器觸發每次執行1s,insert table 500條數據,那麼就需要觸發500次觸發器,光是觸發器執行的時間就要花費500s,而insert 500條數據一共是1s,那麼insert的效率就非常的低瞭.
③ 觸發器是針對每一行的,對增刪改非常頻繁的表上切記不要使用觸發器,因為他會非常消耗資源.
到此這篇關於MySQL深入淺出掌握觸發器用法的文章就介紹到這瞭,更多相關MySQL觸發器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!