程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql觸發器(Trigger)簡明總結和應用實例

mysql觸發器(Trigger)簡明總結和應用實例

編輯:MySQL綜合教程

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了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved