在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 應(yīng)用軟件教程 > 詳細(xì)頁面

MySQL 5.0 觸發(fā)器

MySQL 5.0 觸發(fā)器

更新時(shí)間:2025-10-19 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

導(dǎo)數(shù)據(jù)庫,簡(jiǎn)而言之可視為電子化的文件柜——存儲(chǔ)電子文件的處所,用戶可以對(duì)文件中的數(shù)據(jù)進(jìn)行新增、截取、更新、刪除等操作。所謂“數(shù)據(jù)庫”是以一定方式儲(chǔ)存在一起、能與多個(gè)用戶共享、具有盡可能小的冗余度、與應(yīng)...
數(shù)據(jù)庫,簡(jiǎn)而言之可視為電子化的文件柜——存儲(chǔ)電子文件的處所,用戶可以對(duì)文件中的數(shù)據(jù)進(jìn)行新增、截取、更新、刪除等操作。所謂“數(shù)據(jù)庫”是以一定方式儲(chǔ)存在一起、能與多個(gè)用戶共享、具有盡可能小的冗余度、與應(yīng)用程序彼此獨(dú)立的數(shù)據(jù)集合。
Conventions and Styles約定和編程風(fēng)格
每次我想要演示實(shí)際代碼時(shí),我會(huì)對(duì)mysql客戶端的屏幕就出現(xiàn)的代碼進(jìn)行調(diào)整,將字體改成Courier,使他們看起來與普通文本不一樣(讓大家區(qū)別程序代碼和正文)。在這里舉個(gè)例子:

mysql> DROP FUNCTION f;
Query OK, 0 rows affected (0.00 sec)

如果實(shí)例比較大,則需要在某些行和段落間加注釋,同時(shí)我會(huì)用將"<--"符號(hào)放在頁面的右邊以表示強(qiáng)調(diào)。例如:

mysql> CREATE PROCEDURE p ()
-> BEGIN
-> /* This procedure does nothing */ <--
-> END;//
Query OK, 0 rows affected (0.00 sec)

有時(shí)候我會(huì)將例子中的"mysql>"和"->"這些系統(tǒng)顯示去掉,你可以直接將代碼復(fù)制到mysql客戶端程序中(如果你現(xiàn)在所讀的不是電子版的,可以在mysql.com網(wǎng)站下載相關(guān)腳本)

所以的例子都已經(jīng)在Suse 9.2 Linux、Mysql 5.0.3公共版上測(cè)試通過。在您閱讀本書的時(shí)候,Mysql已經(jīng)有更高的版本,同時(shí)能支持更多OS了,包括Windows,Sparc,HP-UX。因此這里的
例子將能正常的運(yùn)行在您的電腦上。但如果運(yùn)行仍然出現(xiàn)故障,可以咨詢你認(rèn)識(shí)的資深Mysql用戶,這樣就能得到比較好的支持和幫助。轉(zhuǎn)載請(qǐng)注明翻譯者陳朋奕及轉(zhuǎn)自:www.phpv.net


Why Triggers 為什么要用觸發(fā)器

我們?cè)贛ySQL 5.0中包含對(duì)觸發(fā)器的支持是由于以下原因:

MySQL早期版本的用戶長(zhǎng)期有需要觸發(fā)器的要求。
我們?cè)?jīng)許諾支持所有ANSI標(biāo)準(zhǔn)的特性。
您可以使用它來檢查或預(yù)防壞的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫。
您可以改變或者取消INSERT, UPDATE以及DELETE語句。
您可以在一個(gè)會(huì)話中監(jiān)視數(shù)據(jù)改變的動(dòng)作。

在這里我假定大家都讀過"MySQL新特性"叢書的第一集--"MySQL存儲(chǔ)過程",那么大家都應(yīng)該知道MySQL至此存儲(chǔ)過程和函數(shù),那是很重要的知識(shí),因?yàn)樵谟|發(fā)器中你可以使用在函數(shù)中使用的語句。特別舉個(gè)例子:

復(fù)合語句(BEGIN / END)是合法的.轉(zhuǎn)載請(qǐng)注明翻譯者陳朋奕及轉(zhuǎn)自:www.phpv.net

流控制(Flow-of-control)語句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.
變量聲明(DECLARE)以及指派(SET)是合法的.
允許條件聲明.
異常處理聲明也是允許的.

但是在這里要記住函數(shù)有受限條件:不能在函數(shù)中訪問表.因此在函數(shù)中使用以下語句是非法的。

ALTER ’CACHE INDEX’ CALL COMMIT CREATE DELETE
DROP ’FLUSH PRIVILEGES’ GRANT INSERT KILL
LOCK OPTIMIZE REPAIR REPLACE REVOKE
ROLLBACK SAVEPOINT ’SELECT FROM table’
’SET system variable’ ’SET TRANSACTION’
SHOW ’START TRANSACTION’ TRUNCATE UPDATE

在觸發(fā)器中也有完全一樣的限制.

觸發(fā)器相對(duì)而言比較新,因此會(huì)有(bugs)缺陷.所以我在這里給大家警告,就像我在存儲(chǔ)過程書中所說那樣.不要在含有重要數(shù)據(jù)的數(shù)據(jù)庫中使用這個(gè)觸發(fā)器,如果需要的話在一些以測(cè)試為目的的數(shù)據(jù)庫上使用,同時(shí)在你對(duì)表創(chuàng)建觸發(fā)器時(shí)確認(rèn)這些數(shù)據(jù)庫是默認(rèn)的。
 
Syntax 語法
1. Syntax: Name 語法:命名規(guī)則轉(zhuǎn)載請(qǐng)注明翻譯者陳朋奕及轉(zhuǎn)自:www.phpv.net


CREATE TRIGGER <觸發(fā)器名稱>               <--
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名稱>
FOR EACH ROW
<觸發(fā)器SQL語句>

觸發(fā)器必須有名字,最多64個(gè)字符,可能后面會(huì)附有分隔符.它和MySQL中其他對(duì)象的命名方式基本相象.

這里我有個(gè)習(xí)慣:就是用表的名字+’_’+觸發(fā)器類型的縮寫.因此如果是表t26,觸發(fā)器是在事件UPDATE(參考下面的點(diǎn)(2)和(3))之前(BEFORE)的,那么它的名字就是t26_bu。
 
2. Syntax: Time 語法:觸發(fā)時(shí)間

CREATE TRIGGER <觸發(fā)器名稱>
{ BEFORE | AFTER } <--
{ INSERT | UPDATE | DELETE }
ON <表名稱>
FOR EACH ROW
<觸發(fā)的SQL語句>

觸發(fā)器有執(zhí)行的時(shí)間設(shè)置:可以設(shè)置為事件發(fā)生前或后。
 
[page_break]3. Syntax: Event語法:事件

CREATE TRIGGER <觸發(fā)器名稱>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE } <--
ON <表名稱>
FOR EACH ROW
<觸發(fā)的SQL語句>

同樣也能設(shè)定觸發(fā)的事件:它們可以在執(zhí)行insert、update或delete的過程中觸發(fā)。

4. Syntax: Table 語法:表

CREATE TRIGGER <觸發(fā)器名稱>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名稱>                    <--
FOR EACH ROW
<觸發(fā)的SQL語句>

觸發(fā)器是屬于某一個(gè)表的:當(dāng)在這個(gè)表上執(zhí)行插入、更新或刪除操作的時(shí)候就導(dǎo)致觸發(fā)器的激活.
我們不能給同一張表的同一個(gè)事件安排兩個(gè)觸發(fā)器。

5. Syntax: Granularity 語法:( :( 步長(zhǎng))觸發(fā)間隔

CREATE TRIGGER <觸發(fā)器名稱>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名稱>
FOR EACH ROW                 <--
<觸發(fā)的SQL語句>

觸發(fā)器的執(zhí)行間隔:FOR EACH ROW子句通知觸發(fā)器每隔一行執(zhí)行一次動(dòng)作,而不是對(duì)整個(gè)表執(zhí)行一次。


6. Syntax: Statement 語法:語句

CREATE TRIGGER <觸發(fā)器名稱>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名稱>
FOR EACH ROW
<觸發(fā)的SQL語句>                      <--

觸發(fā)器包含所要觸發(fā)的SQL語句:這里的語句可以是任何合法的語句,包括復(fù)合語句,但是這里的語句受的限制和函數(shù)的一樣。

Privileges權(quán)限

你必須擁有相當(dāng)大的權(quán)限才能創(chuàng)建觸發(fā)器(CREATE TRIGGER)。如果你已經(jīng)是Root用戶,那么就足夠了。這跟SQL的標(biāo)準(zhǔn)有所不同,我也希望能盡快改成標(biāo)準(zhǔn)的。

因此在下一個(gè)版本的MySQL中,你完全有可能看到有一種叫做CREATE TRIGGER的新權(quán)限。然后通過這樣的方法賦予:

GRANT CREATE TRIGGER ON <表名稱> TO <用戶或用戶列表>;

也可以通過這樣收回權(quán)限:

REVOKE CREATE TRIGGER ON <表名稱> FROM <用戶或用戶列表>;

Referring to OLD and NEW columns 關(guān)于舊的和新創(chuàng)建的列的標(biāo)識(shí)

在觸發(fā)器的SQL語句中,你可以關(guān)聯(lián)表中的任意列。但你不能僅使用列的名稱去標(biāo)識(shí),那會(huì)使系統(tǒng)混淆,因?yàn)槟抢锟赡軙?huì)有列的新名(這可能正是你要修改的,你的動(dòng)作可能正是要修改列名),還有列的舊名存在。因此你必須用這樣的語法來標(biāo)識(shí):

"NEW . column_name"或者"OLD . column_name".這樣在技術(shù)上處理(NEW | OLD . column_name)新和舊的列名屬于創(chuàng)建了過渡變量("transition variables")。

對(duì)于INSERT語句,只有NEW是合法的;對(duì)于DELETE語句,只有OLD才合法;而UPDATE語句可以在和NEW以及OLD同時(shí)使用。下面是一個(gè)UPDATE中同時(shí)使用NEW和OLD的例子。

CREATE TRIGGER t21_au
BEFORE UPDATE ON t22
FOR EACH ROW
BEGIN
SET @old = OLD . s1;
SET @new = NEW.s1;
END;//

現(xiàn)在如果t21表中的s1列的值是55,那么執(zhí)行了"UPDATE t21 SET s1 = s1 + 1"之后@old的值會(huì)變成55,而@new的值將會(huì)變成56。


Example of CREATE and INSERT CREATE和INSERT的例子

CREATE table with trigger創(chuàng)建有觸發(fā)器的表

這里所有的例程中我都假定大家的分隔符已經(jīng)設(shè)置成//(DELIMITER //)。

CREATE TABLE t22 (s1 INTEGER)//

CREATE TRIGGER t22_bi
BEFORE INSERT ON t22
FOR EACH ROW
BEGIN
SET @x = ’Trigger was activated!’;
SET NEW.s1 = 55;
END;//

在最開始我創(chuàng)建了一個(gè)名字為t22的表,然后在表t22上創(chuàng)建了一個(gè)觸發(fā)器t22_bi,當(dāng)我們要向表中的行插入時(shí),觸發(fā)器就會(huì)被激活,執(zhí)行將s1列的值改為55的動(dòng)作。

INSERT on table w ith a trigger使用觸發(fā)器執(zhí)行插入動(dòng)作

mysql> INSERT INTO t22 VALUES (1)//

讓我們看如果向表t2中插入一行數(shù)據(jù)觸發(fā)器對(duì)應(yīng)的表會(huì)怎么樣?

這里的插入的動(dòng)作是很常見的,我們不需要觸發(fā)器的權(quán)限來執(zhí)行它。甚至不需要知道是否有觸發(fā)器關(guān)聯(lián)。

mysql> SELECT @x, t22.* FROM t22//
+------------------------+------+
| @x              | s1   |
+------------------------+------+
| Trigger was activated! | 55 |
+------------------------+------+
1 row in set (0.00 sec)

大家可以看到INSERT動(dòng)作之后的結(jié)果,和我們預(yù)期的一樣,x標(biāo)記被改動(dòng)了,同時(shí)這里插入的數(shù)據(jù)不是我們開始輸入的插入數(shù)據(jù),而是觸發(fā)器自己的數(shù)據(jù)。
Example of a "check" constraint 
"check"完整性約束例子

What’s a "check" constraint 什么是"check"約束

在標(biāo)準(zhǔn)的SQL語言中,我們可以在(CREATE TABLE)創(chuàng)建表的過程中使用"CHECK (condition)",
例如:
CREATE TABLE t25
(s1 INT, s2 CHAR(5), PRIMARY KEY (s1),
CHECK (LEFT(s2,1)=’A’))
ENGINE=INNODB;

這里CHECK的意思是"當(dāng)s2列的最左邊的字符不是’A’時(shí),insert和update語句都會(huì)非法",MySQL的視圖不支持CHECK,我個(gè)人是很希望它能支持的。但如果你很需要在表中使用這樣的功能,我建議大家使用觸發(fā)器來實(shí)現(xiàn)。
[page_break]CREATE TABLE t25
(s1 INT, s2 CHAR(5),
PRIMARY KEY (s1))
ENGINE=INNODB//

CREATE TRIGGER t25_bi
BEFORE INSERT ON t25
FOR EACH ROW
IF LEFT(NEW.s2,1)<>’A’ THEN SET NEW.s1=0; END IF;//

CREATE TRIGGER t25_bu
BEFORE UPDATE ON t25
FOR EACH ROW
IF LEFT(NEW.s2,1)<>’A’ THEN SET NEW.s1=0; END IF;//

我只需要使用BEFORE INSERT和BEFORE UPDATE語句就行了,刪除了觸發(fā)器不會(huì)對(duì)表有影響,同時(shí)AFTER的觸發(fā)器也不能修改NEW的過程變量(transition variables)。為了激活觸發(fā)器,我執(zhí)行了向表中的行插入s1=0的數(shù)據(jù),之后只要執(zhí)行符合LEFT(s2,1) <> ’A’條件的動(dòng)作都會(huì)失敗:轉(zhuǎn)載請(qǐng)注明翻譯者陳朋奕及轉(zhuǎn)自:www.phpv.net


INSERT INTO t25 VALUES (0,’a’) /* priming the pump */ //
INSERT INTO t25 VALUES (5,’b’) /* gets error ’23000’ */ //

Don’t Believe The Old MySQL Manual 
該拋棄舊的MySQL的手冊(cè)了
我在這里警告大家不要相信過去的MySQL手冊(cè)中所說的了。我們已經(jīng)去掉了關(guān)于觸發(fā)器的錯(cuò)誤的語句,但是仍舊有很多舊版本的手冊(cè)在網(wǎng)上,舉個(gè)例子,這是一個(gè)德國的Url上的:
http://dev.mysql.com/doc/mysql/de/ANSI_diff_Triggers.html.

這個(gè)手冊(cè)上說觸發(fā)器就是存儲(chǔ)過程,忘掉吧,你也已經(jīng)看見了,觸發(fā)器就是觸發(fā)器,而存儲(chǔ)過程還是存儲(chǔ)過程。

手冊(cè)上還說觸發(fā)器可以從其他表上來刪除,或者是當(dāng)你刪除一個(gè)事務(wù)的時(shí)候激發(fā),無論他說的是什么意思,忘掉吧,MySQL不會(huì)去實(shí)現(xiàn)這些的。轉(zhuǎn)載請(qǐng)注明翻譯者陳朋奕及轉(zhuǎn)自:www.phpv.net


最后關(guān)于說使用觸發(fā)器會(huì)對(duì)查詢速度產(chǎn)生影響的說法也是錯(cuò)的,觸發(fā)器不會(huì)對(duì)查詢產(chǎn)生任何影響。

Bugs
(不好的東西就不翻譯了)
On December 14 2004, I did an "Advanced Search" in http://bugs.mysql.com for ’trigger’ or
’triggers’, I found that there were 17 active bugs as of that date. Of course they might disappear
before you read this, but just in case they haven’t, I’ll mention the important ones. If they’re still
there, you’ll have to work around them when you’re trying triggers.

Bug#5859    DROP TABLE does not drop triggers.
(刪除表的時(shí)候沒有自動(dòng)刪除觸發(fā)器)
When you drop a table, dropping the table’s triggers should be automatic.

Bug#5892    Triggers have the wrong namespace.
(觸發(fā)器的命名空間有錯(cuò),你必須在前面加上表的名字才能刪除觸發(fā)器,下面是例子)
You have to say "DROP TRIGGER <table name> . <trigger name>".
The correct way is "DROP TRIGGER <trigger name>".

Bug#5894    Triggers with altered tables cause corrupt databases.
(觸發(fā)器對(duì)表的改變可能會(huì)造成數(shù)據(jù)庫數(shù)據(jù)被破壞)
Do not alter a table that has a trigger on it, until you know this is fixed.

全新的路由器不僅讓你更穩(wěn)定快速地連接無線網(wǎng)絡(luò),更可以讓家中的智能設(shè)備連接在一起。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 国产a级黄色大片| 欧美视频在线观看视频| 国产玉足脚交久久欧美| 北条麻妃亚洲一区| 一区二区xxx| jizz大全欧美jizzcom| 在线免费视频a| www.日本xxxx| 欧美第一页浮力影院| 午夜免费福利在线| 人人干人人干人人| av亚洲天堂网| 黄黄视频在线观看| 国产欧美日韩小视频| 妺妺窝人体色777777| 男女激情无遮挡| 熟妇人妻va精品中文字幕| 日本精品www| www.天天射.com| 中文字幕永久视频| 午夜啪啪免费视频| 精品少妇在线视频| 国产成人无码a区在线观看视频| 在线观看17c| 人妻少妇精品久久| 日本免费黄视频| 国产精品入口免费软件| 色综合五月婷婷| www.亚洲一区二区| 免费看国产一级片| 美女福利视频在线| www.日本一区| 黄色a级片免费看| 青青青在线视频免费观看| 91香蕉视频免费看| 男人天堂999| 99久久99精品| 狠狠97人人婷婷五月| 亚洲少妇第一页| 成人免费看片视频在线观看| 97在线国产视频| 午夜宅男在线视频| 人妻av无码专区| 啊啊啊国产视频| 毛片在线视频观看| 韩国中文字幕av| 欧美三级一级片| 免费看日b视频| 国内av免费观看| 韩国日本在线视频| 久草免费福利在线| 亚洲欧美自拍另类日韩| 国产精品av免费观看| 亚洲综合在线网站| 青青艹视频在线| 日本黄大片在线观看| 日本黄色播放器| www.夜夜爽| 亚洲性生活网站| 免费日韩视频在线观看| 国产二区视频在线| 黄色污污在线观看| 天天操精品视频| 亚洲精品国产一区二区三区| 天美星空大象mv在线观看视频| 国产精品沙发午睡系列| 日韩不卡一二区| 中文字幕色网站| 日本福利视频导航| 久久久一二三四| 欧美国产在线一区| 在线观看日本www| 在线播放av中文字幕| 91制片厂毛片| 日本黄色的视频| 99视频在线观看视频| 国产福利片一区二区| 久久免费视频2| 97在线国产视频| 国产v片免费观看| 精品久久久久久久免费人妻| 免费一级特黄毛片| 91视频最新入口| 日本xxxxxxx免费视频| 五月婷婷激情久久| 黄色一级片网址| 国产人妻777人伦精品hd| 国产极品在线视频| 玩弄japan白嫩少妇hd| 999在线精品视频| av免费看网址| 欧美精品自拍视频| 成品人视频ww入口| 欧美性潮喷xxxxx免费视频看| 霍思燕三级露全乳照| 亚洲成人av免费看| 精品国产无码在线| 国产人妻777人伦精品hd| 国产精品第12页| 午夜影院免费观看视频| a在线视频观看| 亚洲天堂伊人网| 凹凸国产熟女精品视频| 91欧美一区二区三区| 黄色一级视频在线播放| 亚洲激情在线看| 日本午夜激情视频| 91丝袜超薄交口足| 人妻熟妇乱又伦精品视频| 97超碰人人爽| 久久久精品在线视频| 丰满人妻一区二区三区53号| 干日本少妇首页| 国产欧美日韩网站| 视色,视色影院,视色影库,视色网| 国产精品亚洲a| 免费av手机在线观看| 波多野结衣三级在线| 久久撸在线视频| 嫩草av久久伊人妇女超级a| 国产一区二区三区小说| 大桥未久一区二区| 久久久久久久久久一区二区| av免费中文字幕| 欧美视频第一区| 漂亮人妻被中出中文字幕| 精品国偷自产一区二区三区| 午夜大片在线观看| 中文字幕久久av| 看看黄色一级片| 精品亚洲视频在线| 182午夜视频| 嫩草av久久伊人妇女超级a| 国产特级黄色大片| 成人性生活视频免费看| 丰满的少妇愉情hd高清果冻传媒| 久久人人爽人人片| 九九九久久久久久久| www.桃色.com| 精品国产三级a∨在线| 法国空姐在线观看免费| 日韩人妻一区二区三区蜜桃视频| 超碰在线资源站| 日韩人妻精品一区二区三区| 特级毛片在线免费观看| 4444在线观看| 国产va亚洲va在线va| 欧美日本视频在线观看| 日本一本二本在线观看| 亚洲少妇第一页| 欧美性受xxxxxx黑人xyx性爽| 黄色高清视频网站| 国产www免费| 国产精品涩涩涩视频网站| 亚洲综合av在线播放| 国产精品亚洲天堂| 国产中文字幕二区| av网站在线不卡| 国产又粗又长又爽视频| 黄色免费福利视频| 亚洲成人天堂网| 国产aaa免费视频| xxxx一级片| 欧美黄色免费网址| 亚欧在线免费观看| 超碰10000| 国产三级三级看三级| 男同互操gay射视频在线看| 欧美综合在线播放| 天天干天天色天天干| 无码粉嫩虎白一线天在线观看| 嫩草影院国产精品| 99热这里只有精品免费| 国产一区亚洲二区三区| 黄瓜视频免费观看在线观看www | 免费超爽大片黄| 国产小视频精品| 久色视频在线播放| 精品久久免费观看| 88av.com| 久久久久人妻精品一区三寸| 中文字幕在线乱| 亚洲最大综合网| 免费看日本毛片| 无码熟妇人妻av在线电影| 国产美女18xxxx免费视频| 欧美一区二区三区爽大粗免费| 99国产精品久久久久久| 欧美精品无码一区二区三区| 国产精品va在线观看无码| 亚洲综合日韩欧美| 青青在线视频免费| 99精品人妻少妇一区二区| 91大学生片黄在线观看| 九九九九九国产| 免费一级特黄录像| 久久久久久久片| 国产精品69页| 日韩欧美精品在线观看视频| 波多野结衣综合网|