mysql觸發器(Trigger)簡明總結和應用實例。本站提示廣大學習愛好者:(mysql觸發器(Trigger)簡明總結和應用實例)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql觸發器(Trigger)簡明總結和應用實例正文
一,甚麼觸發器
1,小我懂得
觸發器,從字面來懂得,劍拔弩張的一個器,簡稱觸發器(哈哈,小我懂得),舉個例子吧,比如天亮了,你開燈了,你看到器械了。你放炮仗,撲滅了,一會就炸了。
2,官方界說
觸發器(trigger)是個特別的存儲進程,它的履行不是由法式挪用,也不是手工啟動,而是由事宜來觸發,好比當對一個表停止操作( insert,delete, update)時就會激活它履行。觸發器常常用於增強數據的完全性束縛和營業規矩等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。
觸發器有一個異常好的特征就是:觸發器可以制止或回滾違背援用完全性的更改,從而撤消所測驗考試的數據修正。
甚麼意思,舉個例子說明一下,街機游戲年夜家都玩過吧,闖過一關,闖下一關,有一關沒闖過就要從第一關開端。觸發器根這個相似。
官方說明以下
觸發法式視為單一生意業務中的一部分,是以可以由原觸發法式復原生意業務,假如在生意業務進程中偵測到嚴重的毛病(如應用者中止連線),則會主動復原全部生意業務。
他的感化很顯著了,可以珍重數據的完全性,上面有一個實例來講明他的利益,和假如使編寫代碼不那末龐雜
二,觸發器語法
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
觸發法式是與表有關的定名數據庫對象,當表上湧現特定事宜時,將激該死對象。
觸發法式與定名為tbl_name的表相干。tbl_name必需援用永遠性表。不克不及將觸發法式與TEMPORARY表或視圖聯系關系起來。
trigger_time是觸發法式的舉措時光。它可所以BEFORE或AFTER,以指明觸發法式是在激活它的語句之前或以後觸發。
trigger_event指清楚明了激活觸發法式的語句的類型。trigger_event可所以下述值之一:
· INSERT:將新行拔出表時激活觸發法式,例如,經由過程INSERT、LOAD DATA和REPLACE語句。
· UPDATE:更改某一行時激活觸發法式,例如,經由過程UPDATE語句。
· DELETE:從表中刪除某一行時激活觸發法式,例如,經由過程DELETE和REPLACE語句。
請留意,trigger_event與以表操作方法激活觸發法式的SQL語句其實不很相似,這點很主要。例如,關於INSERT的BEFORE觸發法式不只能被INSERT語句激活,也能被LOAD DATA語句激活。
能夠會形成混雜的例子之一是INSERT INTO .. ON DUPLICATE UPDATE ...語法:BEFORE INSERT觸發法式關於每即將激活,後跟AFTER INSERT觸發法式,或BEFORE UPDATE和AFTER UPDATE觸發法式,詳細情形取決於行上能否有反復鍵。
關於具有雷同觸發法式舉措時光和事宜的給定表,不克不及有兩個觸發法式。例如,關於某一表,不克不及有兩個BEFORE UPDATE觸發法式。但可以有1個BEFORE UPDATE觸發法式和1個BEFORE INSERT觸發法式,或1個BEFORE UPDATE觸發法式和1個AFTER UPDATE觸發法式。
trigger_stmt是當觸發法式激活時履行的語句。假如你盤算履行多個語句,可以使用BEGIN ... END復合語句構造。如許,就可以應用存儲子法式中許可的雷同語句
三,創立解發器
1,用戶表user
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment COMMENT '用戶ID',
`name` varchar(50) NOT NULL default '' COMMENT '稱號',
`sex` int(1) NOT NULL default '0' COMMENT '0為男,1為女',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
INSERT INTO `user` (`id`, `name`, `sex`) VALUES
(1, '張映', 0),
(2, 'tank', 0);
2,評論表comment
CREATE TABLE `comment` (
`c_id` int(11) NOT NULL auto_increment COMMENT '評論ID',
`u_id` int(11) NOT NULL COMMENT '用戶ID',
`name` varchar(50) NOT NULL default '' COMMENT '用戶稱號',
`content` varchar(1000) NOT NULL default '' COMMENT '評論內容',
PRIMARY KEY (`c_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
INSERT INTO `comment` (`c_id`, `u_id`, `name`, `content`) VALUES
(1, 1, '張映', '觸發器測試'),
(2, 1, '張映', '處理字段冗余'),
(3, 2, 'tank', '使代碼更簡略');
在這裡有一個冗余字段name,我們在讀取評論進可以用結合查尋來找到user表中的名字,為何要有冗余字段呢,因簡略的sql語句履行效力更高,但不是冗余字段越多越好,冗余字段多了,異樣會增長數據庫累贅 .
我要做的工作是,當我更新user表的name時,觸發器同時更新comment表,就不要寫php代碼去更新了,當用戶被刪除時,comment表中,有關該用戶的數據將被刪除
3,更新name觸發器
delimiter || //mysql 默許停止符號是分號,當你在寫觸發器或許存儲進程時有分號湧現,會中斷轉而履行
drop trigger if exists updatename|| //刪除同名的觸發器,
create trigger updatename after update on user for each row //樹立觸發器,
begin
//old,new都是代表以後操作的記載行,你把它當做表名,也行;
if new.name!=old.name then //當表頂用戶稱號產生變更時,履行
update comment set comment.name=new.name where comment.u_id=old.id;
end if;
end||
delimiter ;
4,觸發器刪除comment數據
delimiter ||
drop trigger if exists deletecomment||
create trigger deletecomment before delete on user for each row
begin
delete from comment where comment.u_id=old.id;
end||
delimiter ;
有一點很讓人愁悶,就是寫好的觸發器代碼,不克不及修正,你要刪除失落重建,愁悶中,對了還有一點就是phpmyadmin,有的能創立觸發器,有的不克不及,有的能創立,但創立了看不到。在研討一下。
5,測試觸發器能否可用
a,測試updata觸發器
update user set name='蒼鷹' where id = 1;
更新後去comment內外面看看,外面name字段外面的段有無轉變
b,測試delete觸發器
delete from user where id = 1;
更新後去comment內外面看看,外面name字段外面的段有無轉變
四,觸發器的長處
1,觸發器的"主動性"
對法式員來講,觸發器是看不到的,然則他切實其實干事情了,假如不消觸發器的話,你更新了user表的name字段時,你還要寫代碼去更新其他內外面的冗余字段,我舉例子,只是一張表,假如是幾張表都有冗余字段呢,你的代碼是否是要寫許多呢,看上去是否是很不爽呢。
2,觸發器的數據完全性
觸發器有回滾性,舉個例子,我發明我很愛好舉子,就是你要更新五張表的數據,不會湧現更新了二個張表,而別的三張表沒有更新。
然則假如是用php代碼去寫的話,就有能夠湧現這類情形的,好比你更新了二張表的數據,這個時刻,數據庫掛失落了。你就愁悶了,有的更新了,有的沒更新。如許頁面顯示紛歧致了,變有bug了。