MySQL深入淺出掌握觸發(fā)器用法
MySQL觸發(fā)器
觸發(fā)器是一種特殊的存儲過程,觸發(fā)器和存儲過程一樣是一個能完成特定功能、存儲在數(shù)據(jù)庫服務(wù)器上的SQL片段,但是觸發(fā)器無需調(diào)用,當(dāng)對數(shù)據(jù)庫表中的數(shù)據(jù)執(zhí)行DML操作時自動觸發(fā)這個SQL片段的執(zhí)行,無需手動調(diào)用.
在MySQL中,只要執(zhí)行insert,update,delete操作是才能觸發(fā)觸發(fā)器的執(zhí)行
觸發(fā)器的這種特性可以協(xié)助應(yīng)用在數(shù)據(jù)庫端確保數(shù)據(jù)的完整性,日志記錄,數(shù)據(jù)校驗等操作.
使用別名OLD和NEW來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,這與其他的數(shù)據(jù)庫是相似的,現(xiàn)在觸發(fā)器還值支持行級觸發(fā),不支持語句級觸發(fā).
觸發(fā)器的特性
① 什么條件會觸發(fā): insert,delete,update
② 什么時候觸發(fā): 在增刪改前或者后
③ 觸發(fā)頻率: 針對每一行執(zhí)行
④ 觸發(fā)器定義在表上,附著在表上
創(chuàng)建觸發(fā)器
-- 創(chuàng)建只有一個執(zhí)行語句的觸發(fā)器
格式:
create trigger 觸發(fā)器名 before|after 觸發(fā)事件
on 表名 for each row
執(zhí)行語句;-- 創(chuàng)建有多個執(zhí)行語句的觸發(fā)器
格式:
create trigger 觸發(fā)器名 before|after 觸發(fā)事件
on 表名 for each row
begin
執(zhí)行語句列表
end;
demo
-- 需求:當(dāng)user表添加一行數(shù)據(jù),則會自動在user_log添加日志記錄
delimiter $$
create trigger trigger_test after insert
on user for each row
begin
insert into user_logs values(1,now,'有新用戶增加');
end $$
delimiter;
觸發(fā)器操作-NEW和OLD
mysql中定義了new和old,用來表示觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的哪一行數(shù)據(jù),來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,具體如下
| 觸發(fā)器類型 | 觸發(fā)器類型NEW和OLD的使用 |
|---|---|
| INSERT 型觸發(fā)器 | NEW 表示將要或者已經(jīng)新增的數(shù)據(jù) |
| UPDATE 型觸發(fā)器 | OLD 表示修改之前的數(shù)據(jù),NEW表示將要或者已經(jīng)修改后的數(shù)據(jù) |
| DELETE 型觸發(fā)器 | OLD 表示將要或者已經(jīng)刪除的數(shù)據(jù) |
使用方法: NEW.columnName(columnName為相應(yīng)數(shù)據(jù)表某一列名)
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;
觸發(fā)器-查看
show triggers;
觸發(fā)器-刪除
drop trigger if exists trigger_test;
觸發(fā)器的注意事項
① MYSQL中觸發(fā)器中不能對本表進行insert,update,delete操作,以免遞歸循環(huán)觸發(fā)
② 盡量少使用觸發(fā)器,假設(shè)觸發(fā)器觸發(fā)每次執(zhí)行1s,insert table 500條數(shù)據(jù),那么就需要觸發(fā)500次觸發(fā)器,光是觸發(fā)器執(zhí)行的時間就要花費500s,而insert 500條數(shù)據(jù)一共是1s,那么insert的效率就非常的低了.
③ 觸發(fā)器是針對每一行的,對增刪改非常頻繁的表上切記不要使用觸發(fā)器,因為他會非常消耗資源.
到此這篇關(guān)于MySQL深入淺出掌握觸發(fā)器用法的文章就介紹到這了,更多相關(guān)MySQL觸發(fā)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QT連接Mysql數(shù)據(jù)庫的詳細教程(親測成功版)
被Qt連接數(shù)據(jù)庫折磨了三天之后終于連接成功了,記錄一下希望對看到的人有所幫助,下面這篇文章主要給大家介紹了關(guān)于QT連接Mysql數(shù)據(jù)庫的詳細教程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-05-05
關(guān)于數(shù)據(jù)庫中保留小數(shù)位的問題
本篇文章是對關(guān)于在數(shù)據(jù)庫中保留小數(shù)位的問題進行了詳細的分析介紹,需要的朋友參考下2013-07-07

