MySQL觸發(fā)器自動(dòng)智能化的數(shù)據(jù)維護(hù)
觸發(fā)器介紹
觸發(fā)器,就是一種特殊的存儲(chǔ)過程。觸發(fā)器和存儲(chǔ)過程一樣是一個(gè)能夠完成特定功能、存儲(chǔ)在數(shù)據(jù)庫服務(wù)器上的SQL片段,但是觸發(fā)器無需調(diào)用,當(dāng)對(duì)數(shù)據(jù)庫表中的數(shù)據(jù)執(zhí)行DML操作時(shí)自動(dòng)觸發(fā)這個(gè)SQL片段的執(zhí)行,無需手動(dòng)條用。
在MySQL中,只有執(zhí)行insert,delete,update操作時(shí)才能觸發(fā)觸發(fā)器的執(zhí)行
觸發(fā)器的這種特性可以協(xié)助應(yīng)用在數(shù)據(jù)庫端確保數(shù)據(jù)的完整性 , 日志記錄 , 數(shù)據(jù)校驗(yàn)等操作。
使用別名OLD和NEW來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,這與其他的數(shù)據(jù)庫是相似的。現(xiàn)在觸發(fā)器還只支持行級(jí)觸發(fā),不支持語句級(jí)觸發(fā)。
觸發(fā)器的特性
- 1、什么條件會(huì)觸發(fā):I、D、U
- 2、什么時(shí)候觸發(fā):在增刪改前或者后
- 3、觸發(fā)頻率:針對(duì)每一行執(zhí)行
- 4、觸發(fā)器定義在表上,附著在表上
觸發(fā)器語法
1、創(chuàng)建只有一個(gè)執(zhí)行語句的觸發(fā)器
create trigger 觸發(fā)器名 before|after 觸發(fā)事件 on 表名 for each row 執(zhí)行語句;
2、創(chuàng)建有多個(gè)執(zhí)行語句的觸發(fā)器
create trigger 觸發(fā)器名 before|after 觸發(fā)事件 on 表名 for each row begin 執(zhí)行語句列表 end;
數(shù)據(jù)準(zhǔn)備
-- 數(shù)據(jù)準(zhǔn)備 create database if not exists db_trigger; use mydb10_trigger; -- 用戶表 create table user( uid int primary key , username varchar(50) not null, password varchar(50) not null ); -- 用戶信息操作日志表 create table user_logs( id int primary key auto_increment, time timestamp, log_text varchar(255) );
創(chuàng)建觸發(fā)器
-- 如果觸發(fā)器存在,則先刪除 drop trigger if exists trigger_test1; -- 創(chuàng)建觸發(fā)器trigger_test1 create trigger trigger_test1 after insert on user -- 觸發(fā)時(shí)機(jī):當(dāng)添加user表數(shù)據(jù)時(shí)觸發(fā) for each row insert into user_logs values(NULL,now(), '有新用戶注冊(cè)'); -- 添加數(shù)據(jù),觸發(fā)器自動(dòng)執(zhí)行并添加日志代碼 insert into user values(1,'張三','123456');
從上面的語法我們可以知道,觸發(fā)器的基本的結(jié)構(gòu)是怎樣的
create trigger 觸發(fā)器名稱 after(before)insert(update,delete)on 表名(監(jiān)控表) for each row 執(zhí)行語句
觸發(fā)器——執(zhí)行多個(gè)觸發(fā)語句
-- 如果觸發(fā)器trigger_test2存在,則先刪除 drop trigger if exists trigger_test2; -- 創(chuàng)建觸發(fā)器trigger_test2 delimiter $$ create trigger trigger_test2 after update on user -- 觸發(fā)時(shí)機(jī):當(dāng)修改user表數(shù)據(jù)時(shí)觸發(fā) for each row -- 每一行 begin insert into user_logs values(NULL,now(), '用戶修改發(fā)生了修改'); end $$ delimiter ; -- 添加數(shù)據(jù),觸發(fā)器自動(dòng)執(zhí)行并添加日志代碼 update user set password = '888888' where uid = 1;
這里,采用了標(biāo)準(zhǔn)的格式進(jìn)行觸發(fā)器的語法格式,可以定義多個(gè)執(zhí)行語句,將所有的執(zhí)行語句寫在begin end $$里面,也就是需要采用這樣的方式包裹住。
delimiter $$ create trigger 觸發(fā)器名稱 after(before)insert(update,delete)on 表名 for each row begin 執(zhí)行語句 end $$ delimiter;
也就是說我們將出發(fā)語句,放在了begin 和 end $$ 中間
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ù)表某一列名)
create trigger trigger_test3 after insert on user for each row insert into user_logs values(NULL,now(),concat('有新用戶添加,信息為:',NEW.uid,NEW.username,NEW.password)); -- 測(cè)試 insert into user values(4,'趙六','123456');
查看觸發(fā)器
show triggers;
刪除觸發(fā)器
-- drop trigger [if exists] trigger_name drop trigger if exists trigger_test1;
- 1.MYSQL中觸發(fā)器中不能對(duì)本表進(jìn)行 insert ,update ,delete 操作,以免遞歸循環(huán)觸發(fā)
- 2.盡量少使用觸發(fā)器,假設(shè)觸發(fā)器觸發(fā)每次執(zhí)行1s,insert table 500條數(shù)據(jù),那么就需要觸發(fā)500次觸發(fā)器,光是觸發(fā)器執(zhí)行的時(shí)間就花費(fèi)了500s,而insert 500條數(shù)據(jù)一共是1s,那么這個(gè)insert的效率就非常低了。
- 3. 觸發(fā)器是針對(duì)每一行的;對(duì)增刪改非常頻繁的表上切記不要使用觸發(fā)器,因?yàn)樗鼤?huì)非常消耗資源。
總結(jié)
既然,在MySQL內(nèi)部創(chuàng)建觸發(fā)器,會(huì)使得表的執(zhí)行效率大大降低,我們又如何去監(jiān)控我們的表操作數(shù)據(jù)呢?答案是,我們可以使用后臺(tái)代碼,比如python、java,通過連接數(shù)據(jù)庫,實(shí)現(xiàn)對(duì)數(shù)據(jù)的行為進(jìn)行監(jiān)控,達(dá)到我們?nèi)罩镜谋O(jiān)控(表的操作)。
舉一個(gè)簡單的例子,目前某學(xué)校使用的教務(wù)管理系統(tǒng)是采用傳統(tǒng)的數(shù)據(jù)庫——mysql,現(xiàn)在老師將學(xué)生的成績統(tǒng)一上傳到了后臺(tái),但是發(fā)現(xiàn)有一位同學(xué)的成績出現(xiàn)了錯(cuò)誤,于是它就修改了該同學(xué)的數(shù)據(jù),這個(gè)時(shí)候?qū)iT的記錄操作的表就會(huì)記錄下該老師的操作行為。
到此這篇關(guān)于MySQL觸發(fā)器自動(dòng)智能化的數(shù)據(jù)維護(hù)的文章就介紹到這了,更多相關(guān)MySQL觸發(fā)器 內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。