一文帶你了解MySQL中觸發(fā)器的操作
概述
介紹
- 觸發(fā)器,就是一種特殊的存儲(chǔ)過(guò)程。觸發(fā)器和存儲(chǔ)過(guò)程一樣是一個(gè)能夠完成特定功能、存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器上的SQL片段,但是觸發(fā)器無(wú)需調(diào)用,當(dāng)對(duì)數(shù)據(jù)庫(kù)表中的數(shù)據(jù)執(zhí)行DML操作時(shí)自動(dòng)觸發(fā)這個(gè)SQL片段的執(zhí)行,無(wú)需手動(dòng)條用。
- 在MySQL中,只有執(zhí)行insert,delete,update操作時(shí)才能觸發(fā)觸發(fā)器的執(zhí)行
- 觸發(fā)器的這種特性可以協(xié)助應(yīng)用在數(shù)據(jù)庫(kù)端確保數(shù)據(jù)的完整性,日志記錄,數(shù)據(jù)校驗(yàn)等操作。
- 使用別名OLD和NEW來(lái)引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,這與其他的數(shù)據(jù)庫(kù)是相似的。現(xiàn)在觸發(fā)器還只支持行級(jí)觸發(fā),不支持語(yǔ)句級(jí)觸發(fā)。
觸發(fā)器的特性
- 什么條件會(huì)觸發(fā):l、D、U
- 什么時(shí)候觸發(fā):在增刪改前或者后
- 觸發(fā)頻率:針對(duì)每一行執(zhí)行
- 觸發(fā)器定義在表上,附著在表上
操作—創(chuàng)建觸發(fā)器
格式
1.創(chuàng)建只有一個(gè)執(zhí)行語(yǔ)句的觸發(fā)器
2.創(chuàng)建有多個(gè)執(zhí)行語(yǔ)句的觸發(fā)器
操作
演示
create database if not exists test_trigger; use test_trigger; -- 用戶(hù)表 create table `user` ( uid int primary key, username varchar(50) not null, password varchar(50) not null ); -- 用戶(hù)信息操作日志表 create table user_logs( id int primary key auto_increment, time timestamp, log_text varchar(255) ); -- 需求1:當(dāng)user表添加一行數(shù)據(jù),則會(huì)自動(dòng)在user_log添加日志記錄 -- 定義觸發(fā)器:trigger_test1 create trigger trigger_test1 after insert on user for each row insert into user_logs values(null,now(),'有新用戶(hù)添加'); -- 在user表添加數(shù)據(jù),讓觸發(fā)器自動(dòng)執(zhí)行 insert into `user` values(1,'張三','123456');
結(jié)果展示
create database if not exists test_trigger; use test_trigger; -- 用戶(hù)表 create table `user` ( uid int primary key, username varchar(50) not null, password varchar(50) not null ); -- 用戶(hù)信息操作日志表 create table user_logs( id int primary key auto_increment, time timestamp, log_text varchar(255) ); -- 需求1:當(dāng)user表添加一行數(shù)據(jù),則會(huì)自動(dòng)在user_log添加日志記錄 -- 定義觸發(fā)器:trigger_test1 create trigger trigger_test1 after insert on user for each row insert into user_logs values(null,now(),'有新用戶(hù)添加'); -- 在user表添加數(shù)據(jù),讓觸發(fā)器自動(dòng)執(zhí)行 insert into `user` values(1,'張三','123456'); -- 需求2:當(dāng)user表數(shù)據(jù)被修改時(shí),則會(huì)自動(dòng)在user_log添加日志記錄 delimiter $$ create trigger trigger_test2 after update on user for each row begin insert into user_logs values(null,now(),'有用戶(hù)信息被修改'); end $$ delimiter ; update `user` set password ='222222' where uid=1;
需求2結(jié)果是
操作—new和old
格式
MySQL中定義了NEW和oLD,用來(lái)表示觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù),來(lái)引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,具體地:
觸發(fā)器類(lèi)型 | 觸發(fā)器類(lèi)型的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.columname(columname為相應(yīng)數(shù)據(jù)表某一列名)
演示
create trigger trigger_test3 after insert on user for each row begin insert into user_logs values(null,now(),concat('有新用戶(hù)添加,信息為:',new.uid,new.username,new.password)) ; end; insert into `user` values(2,'李四','24234');
-- update create trigger trigger_test4 after update on user for each row begin insert into user_logs values(null,now(),concat_ws('--','用戶(hù)信息有修改,修改后為:',new.uid,new.username,new.password)); end; update `user` set password='66666' where uid=2;
-- update create trigger trigger_test5 after update on user for each row begin insert into user_logs values(null,now(),concat_ws('--','用戶(hù)信息有修改,修改后為:',new.uid,new.username,new.password, '用戶(hù)信息有修改,修改前為:',old.uid,old.username,old.password)); end; update `user` set password='988765654' where uid=2;
操作—查看觸發(fā)器
操作—刪除觸發(fā)器
注意事項(xiàng)
1.MYSQL中觸發(fā)器中不能對(duì)本表進(jìn)行insert ,update ,delete操作,以免遞歸循環(huán)觸發(fā)
2.盡量少使用觸發(fā)器,假設(shè)觸發(fā)器觸發(fā)每次執(zhí)行1s,insert table 5o0o條數(shù)據(jù),那么就需要觸發(fā)5oo次觸發(fā)器,光是觸發(fā)器執(zhí)行的時(shí)間就花費(fèi)了500s,而insert 50o條數(shù)據(jù)一共是1s,那么這個(gè)insert的效率就非常低了。
3.觸發(fā)器是針對(duì)每一行的;對(duì)增刪改非常頻繁的表上切記不要使用觸發(fā)器,因?yàn)樗鼤?huì)非常消耗資源。
到此這篇關(guān)于一文帶你了解MySQL中觸發(fā)器的操作的文章就介紹到這了,更多相關(guān)MySQL觸發(fā)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
提高M(jìn)ySQL中InnoDB表BLOB列的存儲(chǔ)效率的教程
這篇文章主要介紹了提高M(jìn)ySQL中InnoDB表BLOB列的存儲(chǔ)效率的教程,InnoDB的優(yōu)化在MySQL的優(yōu)化研究中也是一個(gè)非常熱門(mén)的課題,需要的朋友可以參考下2015-05-05MySQL Event Scheduler(事件調(diào)度器)
事件調(diào)度器是在 MySQL 5.1 中新增的另一個(gè)特色功能,可以作為定時(shí)任務(wù)調(diào)度器,取代部分原先只能用操作系統(tǒng)任務(wù)調(diào)度器才能完成的定時(shí)功能。2010-06-06mysqldump備份還原和mysqldump導(dǎo)入導(dǎo)出語(yǔ)句大全詳解
這篇文章主要介紹了mysqldump備份還原和mysqldump導(dǎo)入導(dǎo)出語(yǔ)句大全詳解,需要的朋友可以參考下2014-05-05Mysql主鍵和唯一鍵的區(qū)別點(diǎn)總結(jié)
在本篇文章中小編給大家分享了關(guān)于Mysql主鍵和唯一鍵的區(qū)別,有興趣的朋友們學(xué)習(xí)下吧。2019-02-02