自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL5觸發(fā)器的實際操作功能有哪些?

數(shù)據(jù)庫 MySQL
我們今天主要向大家講述的是MySQL5觸發(fā)器,以及對其為什么一定要使用的原因的介紹,以下就是文章的詳細內(nèi)容的描述。

此文章主要向大家介紹的是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ù)中使用以下語句是非法的。

  1. ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETEDROP   
  2. 'FLUSH PRIVILEGES' GRANT INSERT KILLLOCK OPTIMIZE REPAIR REPLACE REVOKEROLLBACK   
  3. SAVEPOINT 'SELECT FROM table''SET system variable' 'SET TRANSACTION'SHOW 'START TRANSACTION'  
  4. 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的例子。

 

  1. 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)。

 

  1. MySQL(和PHP搭配之最佳組合)> SELECT @x, t22.* FROM t22//+------------------------+------+|   
  2. @x | s1 |+------------------------+------+| Trigger was activated! | 55 |+------------------------+------+  
  3. 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)。

 

 

  1. CREATE TABLE t25(s1 INT, s2 CHAR(5),  
  2. Prima(最完善的虛擬主機管理系統(tǒng))RY KEY (s1))ENGINE=INNODB//CREATE TRIGGER t25_biBEFORE I  
  3. NSERT ON t25FOR EACH ROWIF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0; END IF;  
  4. 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ā)器教程教程的介紹,望你能有所收獲。

【編輯推薦】

  1. MySQL數(shù)據(jù)庫的正確安裝調(diào)試與VC實現(xiàn)很簡單
  2. 配置MySQL數(shù)據(jù)源在tomcat5中的實際操作流程
  3. C++庫連接來對MySQL數(shù)據(jù)庫進行正確連接
  4. MySQL5的基礎(chǔ)知識與常見問題
  5. MySQL查詢優(yōu)化系列之MySQL查詢優(yōu)化器

 

責任編輯:佚名 來源: 博客園
相關(guān)推薦

2010-05-18 14:35:06

MySQL觸發(fā)器

2010-05-19 11:25:46

MySQL觸發(fā)器

2010-06-28 13:27:33

SQL Server視

2023-06-11 16:09:49

觸發(fā)器MySQL

2010-06-10 09:54:54

MySQL編碼

2010-05-18 17:39:13

MySQL alter

2010-06-12 13:39:33

MySQL操作blob

2010-05-24 15:06:52

MySQL內(nèi)建復(fù)制功能

2010-05-17 11:26:49

MySQL 多級同步

2010-05-25 16:31:23

MySQL配置

2010-05-26 16:53:21

MySQL show

2010-05-20 17:40:54

MySQL編碼

2010-05-12 13:45:25

Mysql 復(fù)制設(shè)置

2010-05-19 10:37:06

MySQL expla

2010-05-18 10:07:01

MySQL命令

2010-04-26 14:12:23

Oracle使用游標觸

2010-03-12 15:29:19

Pythonexe

2010-05-18 09:40:01

MySQL修改表字段

2010-05-27 10:35:09

查詢MySQL數(shù)據(jù)

2010-05-26 18:09:42

MySQL啟動
點贊
收藏

51CTO技術(shù)棧公眾號