MySQL5觸發(fā)器的實際操作功能有哪些?
此文章主要向大家介紹的是MySQL5觸發(fā)器,每次我演示實際代碼的時候會對MySQL(和PHP搭配之最佳組合)客戶端的屏幕就出現(xiàn)的代碼進行相關(guān)的調(diào)整,主要是將字體改成Courier,使他們看起來與普通文本不一樣(讓大家區(qū)別程序代碼和正文)。
MySQL5觸發(fā)器教程在這里舉個例子:
MySQL(和PHP搭配之最佳組合)> DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)如果實例比較大,則需要在某些行和段落間加注釋,同時我會用將"<--"符號放在頁面的右邊以表示強調(diào)。例如:
MySQL(和PHP搭配之最佳組合)> CREATE PROCEDURE p ()-> BEGIN-> /* This procedure does nothing */ <---> END;//Query OK, 0 rows affected (0.00 sec)有時候我會將例子中的"MySQL(和PHP搭配之最佳組合)>"和"->"這些系統(tǒng)顯示去掉,你可以直接將代碼復(fù)制到MySQL(和PHP搭配之最佳組合)客戶端程序中(如果你現(xiàn)在所讀的不是電子版的,可以在MySQL(和PHP搭配之最佳組合).com網(wǎng)站下載相關(guān)腳本) 所以的例子都已經(jīng)在Suse 9.2 Linux、MySQL(和PHP搭配之最佳組合) 5.0.3公共版上測試通過。
在您閱讀本書的時候,MySQL(和PHP搭配之最佳組合)已經(jīng)有更高的版本,同時能支持更多OS了,包括Windows,Sparc,HP-UX。因此這里的例子將能正常的運行在您的電腦上。但如果運行仍然出現(xiàn)故障,可以咨詢你認識的資深MySQL(和PHP搭配之最佳組合)用戶,這樣就能得到比較好的支持和幫助。
為什么要用觸發(fā)器
我們在MySQL(和PHP搭配之最佳組合) 5.0中包含對觸發(fā)器的支持是由于以下原因:
MySQL(和PHP搭配之最佳組合)早期版本的用戶長期有需要觸發(fā)器的要求。我們曾經(jīng)許諾支持所有ANSI標準的特性。您可以使用它來檢查或預(yù)防壞的數(shù)據(jù)進入數(shù)據(jù)庫。您可以改變或者取消INSERT, UPDATE以及DELETE語句。您可以在一個會話中監(jiān)視數(shù)據(jù)改變的動作。
在這里我假定大家都讀過"MySQL(和PHP搭配之最佳組合)新特性"叢書的第一集--"MySQL(和PHP搭配之最佳組合)存儲過程",那么大家都應(yīng)該知道MySQL(和PHP搭配之最佳組合)至此存儲過程和函數(shù),那是很重要的知識,因為在觸發(fā)器中你可以使用在函數(shù)中使用的語句。特別舉個例子:
復(fù)合語句(BEGIN / END)是合法的.流控制(Flow-of-control)語句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.變量聲明(DECLARE)以及指派(SET)是合法的.允許條件聲明.異常處理聲明也是允許的.但是在這里要記住函數(shù)有受限條件:不能在函數(shù)中訪問表.因此在函數(shù)中使用以下語句是非法的。
- ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETEDROP
- 'FLUSH PRIVILEGES' GRANT INSERT KILLLOCK OPTIMIZE REPAIR REPLACE REVOKEROLLBACK
- SAVEPOINT 'SELECT FROM table''SET system variable' 'SET TRANSACTION'SHOW 'START TRANSACTION'
- TRUNCATE UPDATE
在MySQL5觸發(fā)器中也有完全一樣的限制.觸發(fā)器相對而言比較新,因此會有(bugs)缺陷.所以我在這里給大家警告,就像我在存儲過程書中所說那樣.不要在含有重要數(shù)據(jù)的數(shù)據(jù)庫中使用這個觸發(fā)器,如果需要的話在一些以測試為目的的數(shù)據(jù)庫上使用,同時在你對表創(chuàng)建觸發(fā)器時確認這些數(shù)據(jù)庫是默認的。
語法
1. 語法:命名規(guī)則CREATE TRIGGER <觸發(fā)器名稱> <--{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名稱>FOR EACH ROW<觸發(fā)器SQL語句>觸發(fā)器必須有名字,最多64個字符,可能后面會附有分隔符.它和MySQL(和PHP搭配之最佳組合)中其他對象的命名方式基本相象.
這里我有個習慣:就是用表的名字+'_'+觸發(fā)器類型的縮寫.因此如果是表t26,觸發(fā)器是在事件UPDATE(參考下面的點(2)和(3))之前(BEFORE)的,那么它的名字就是t26_bu。
2. 語法:
觸發(fā)時間CREATE TRIGGER <觸發(fā)器名稱>{ BEFORE | AFTER } <--{ INSERT | UPDATE | DELETE }ON <表名稱>FOR EACH ROW<觸發(fā)的SQL語句>觸發(fā)器有執(zhí)行的時間設(shè)置:可以設(shè)置為事件發(fā)生前或后。
3. 語法:事件CREATE TRIGGER <觸發(fā)器名稱>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE } <--ON <表名稱>FOR EACH ROW<觸發(fā)的SQL語句>同樣也能設(shè)定觸發(fā)的事件:它們可以在執(zhí)行insert、update或delete的過程中觸發(fā)。
4. 語法:表CREATE TRIGGER <觸發(fā)器名稱>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名稱> <--FOR EACH ROW<觸發(fā)的SQL語句>觸發(fā)器是屬于某一個表的:當在這個表上執(zhí)行插入、更新或刪除操作的時候就導致觸發(fā)器的激活.我們不能給同一張表的同一個事件安排兩個觸發(fā)器。
5. 語法:( 步長)觸發(fā)間隔CREATE TRIGGER <觸發(fā)器名稱>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名稱>FOR EACH ROW <--<觸發(fā)的SQL語句>觸發(fā)器的執(zhí)行間隔:FOR EACH ROW子句通知觸發(fā)器每隔一行執(zhí)行一次動作,而不是對整個表執(zhí)行一次。
6. 語法:語句CREATE TRIGGER <觸發(fā)器名稱>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名稱>FOR EACH ROW<觸發(fā)的SQL語句> <--觸發(fā)器包含所要觸發(fā)的SQL語句:這里的語句可以是任何合法的語句,包括復(fù)合語句,但是這里的語句受的限制和函數(shù)的一樣。Privileges權(quán)限你必須擁有相當大的權(quán)限才能創(chuàng)建觸發(fā)器(CREATE TRIGGER)。
如果你已經(jīng)是Root用戶,那么就足夠了。這跟SQL的標準有所不同。因此在下一個版本的MySQL(和PHP搭配之最佳組合)中,你完全有可能看到有一種叫做CREATE TRIGGER的新權(quán)限。然后通過這樣的方法賦予:GRANT CREATE TRIGGER ON <表名稱> TO <用戶或用戶列表>;也可以通過這樣收回權(quán)限:REVOKE CREATE TRIGGER ON <表名稱> FROM <用戶或用戶列表>;關(guān)于舊的和新創(chuàng)建的列的標識
在觸發(fā)器的SQL語句中,你可以關(guān)聯(lián)表中的任意列。但你不能僅使用列的名稱去標識,那會使系統(tǒng)混淆,因為那里可能會有列的新名(這可能正是你要修改的,你的動作可能正是要修改列名),還有列的舊名存在。因此你必須用這樣的語法來標識: "NEW . column_name"或者"OLD . column_name".這樣在技術(shù)上處理(NEW | OLD . column_name)新和舊的列名屬于創(chuàng)建了過渡變量("transition variables")。
對于INSERT語句,只有NEW是合法的;對于DELETE語句,只有OLD才合法;而UPDATE語句可以在和NEW以及OLD同時使用。下面是一個UPDATE中同時使用NEW和OLD的例子。
- CREATE TRIGGER t21_auBEFORE UPDATE ON t22FOR EACH ROWBEGINSET @old = OLD . s1;SET @new = NEW.s1;END;
現(xiàn)在如果t21表中的s1列的值是55,那么執(zhí)行了"UPDATE t21 SET s1 = s1 + 1"之后@old的值會變成55,而@new的值將會變成56。Example of CREATE and INSERT CREATE和INSERT的例子創(chuàng)建有MySQL5觸發(fā)器的表這里所有的例程中我都假定大家的分隔符已經(jīng)設(shè)置成//(DELIMITER //)。
CREATE TABLE t22 (s1 INTEGER)//CREATE TRIGGER t22_biBEFORE INSERT ON t22FOR EACH ROWBEGINSET @x = 'Trigger was activated!';SET NEW.s1 = 55;END;//在最開始我創(chuàng)建了一個名字為t22的表,然后在表t22上創(chuàng)建了一個觸發(fā)器t22_bi,當我們要向表中的行插入時,觸發(fā)器就會被激活,執(zhí)行將s1列的值改為55的動作。
使用觸發(fā)器執(zhí)行插入動作
MySQL(和PHP搭配之最佳組合)> INSERT INTO t22 VALUES (1)//
讓我們看如果向表t2中插入一行數(shù)據(jù)觸發(fā)器對應(yīng)的表會怎么樣? 這里的插入的動作是很常見的,我們不需要觸發(fā)器的權(quán)限來執(zhí)行它。甚至不需要知道是否有觸發(fā)器關(guān)聯(lián)。
- MySQL(和PHP搭配之最佳組合)> SELECT @x, t22.* FROM t22//+------------------------+------+|
- @x | s1 |+------------------------+------+| Trigger was activated! | 55 |+------------------------+------+
- 1 row in set (0.00 sec)
大家可以看到INSERT動作之后的結(jié)果,和我們預(yù)期的一樣,x標記被改動了,同時這里插入的數(shù)據(jù)不是我們開始輸入的插入數(shù)據(jù),而是觸發(fā)器自己的數(shù)據(jù)。
"check"完整性約束例子什么是"check"約束在標準的SQL語言中,我們可以在(CREATE TABLE)創(chuàng)建表的過程中使用"CHECK (condition)",例如:CREATE TABLE t25(s1 INT, s2 CHAR(5), Prima(最完善的虛擬主機管理系統(tǒng))RY KEY (s1),CHECK (LEFT(s2,1)='A'))ENGINE=INNODB;這里CHECK的意思是"當s2列的最左邊的字符不是'A'時,insert和update語句都會非法",MySQL(和PHP搭配之最佳組合)的視圖不支持CHECK,我個人是很希望它能支持的。
但如果你很需要在表中使用這樣的功能,我建議大家使用觸發(fā)器來實現(xiàn)。
- CREATE TABLE t25(s1 INT, s2 CHAR(5),
- Prima(最完善的虛擬主機管理系統(tǒng))RY KEY (s1))ENGINE=INNODB//CREATE TRIGGER t25_biBEFORE I
- NSERT ON t25FOR EACH ROWIF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0; END IF;
- CREATE TRIGGER t25_buBEFORE UPDATE ON t25FOR EACH ROWIF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0; END IF;
我只需要使用BEFORE INSERT和BEFORE UPDATE語句就行了,刪除了觸發(fā)器不會對表有影響,同時AFTER的觸發(fā)器也不能修改NEW的過程變量(transition variables)。為了激活觸發(fā)器,我執(zhí)行了向表中的行插入s1=0的數(shù)據(jù),之后只要執(zhí)行符合LEFT(s2,1) <> 'A'條件的動作都會失?。?/p>
INSERT INTO t25 VALUES (0,'a') /* priming the pump */ //INSERT INTO t25 VALUES (5,'b') /* gets error '23000' */ //Don't Believe The Old MySQL(和PHP搭配之最佳組合) Manual該拋棄舊的MySQL(和PHP搭配之最佳組合)的手冊了
我在這里警告大家不要相信過去的MySQL(和PHP搭配之最佳組合)手冊中
以上的相關(guān)內(nèi)容就是對MySQL5觸發(fā)器教程教程的介紹,望你能有所收獲。
【編輯推薦】
- MySQL數(shù)據(jù)庫的正確安裝調(diào)試與VC實現(xiàn)很簡單
- 配置MySQL數(shù)據(jù)源在tomcat5中的實際操作流程
- C++庫連接來對MySQL數(shù)據(jù)庫進行正確連接
- MySQL5的基礎(chǔ)知識與常見問題
- MySQL查詢優(yōu)化系列之MySQL查詢優(yōu)化器