更新時間:2022年10月31日17時52分 來源:傳智教育 瀏覽次數(shù):
觸發(fā)器,就是一種特殊的存儲過程。觸發(fā)器和存儲過程一樣是一個能夠完成特定功能、存儲在數(shù)據(jù)庫服務器上的SQL片段,但是觸發(fā)器無需調(diào)用,當對數(shù)據(jù)庫表中的數(shù)據(jù)執(zhí)行DML操作時自動觸發(fā)這個SQL片段的執(zhí)行,無需手動調(diào)用。觸發(fā)器的這種特性可以協(xié)助應用在數(shù)據(jù)庫端確保數(shù)據(jù)的完整性 , 日志記錄 , 數(shù)據(jù)校驗等操作 。在MySQL中,只有執(zhí)行insert,delete,update操作時才能觸發(fā)觸發(fā)器的執(zhí)行。
使用別名 OLD 和 NEW 來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,這與其他的數(shù)據(jù)庫是相似的。現(xiàn)在觸發(fā)器還只支持行級觸發(fā),不支持語句級觸發(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;
-- 數(shù)據(jù)準備 create database if not exists mydb10_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) );
-- 如果觸發(fā)器存在,則先刪除 drop trigger if exists trigger_test1; -- 創(chuàng)建觸發(fā)器trigger_test1 create trigger trigger_test1 after insert on user -- 觸發(fā)時機:當添加user表數(shù)據(jù)時觸發(fā) for each row insert into user_logs values(NULL,now(), '有新用戶注冊'); -- 添加數(shù)據(jù),觸發(fā)器自動執(zhí)行并添加日志代碼 insert into user values(1,'張三','123456');
-- 如果觸發(fā)器trigger_test2存在,則先刪除 drop trigger if exists trigger_test2; -- 創(chuàng)建觸發(fā)器trigger_test2 delimiter $$ create trigger trigger_test2 after update on user -- 觸發(fā)時機:當修改user表數(shù)據(jù)時觸發(fā) for each row -- 每一行 begin insert into user_logs values(NULL,now(), '用戶修改發(fā)生了修改'); end $$ delimiter ; -- 添加數(shù)據(jù),觸發(fā)器自動執(zhí)行并添加日志代碼 update user set password = '888888' where uid = 1;
MySQL 中定義了 NEW 和 OLD,用來表示觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù),來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,具體地:
使用方法:NEW.columnName (columnName為相應數(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)); -- 測試 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ā)器中不能對本表進行 insert ,update ,delete 操作,以免遞歸循環(huán)觸發(fā)。
2.盡量少使用觸發(fā)器,假設觸發(fā)器觸發(fā)每次執(zhí)行1s,insert table 500條數(shù)據(jù),那么就需要觸發(fā)500次觸發(fā)器,光是觸發(fā)器執(zhí)行的時間就花費了500s,而insert 500條數(shù)據(jù)一共是1s,那么這個insert的效率就非常低了。
3. 觸發(fā)器是針對每一行的;對增刪改非常頻繁的表上切記不要使用觸發(fā)器,因為它會非常消耗資源。