<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        MySQL5觸發(fā)器教程

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 14:42:08
        文檔

        MySQL5觸發(fā)器教程

        MySQL5觸發(fā)器教程:約定和編程風(fēng)格 每次我想要演示實(shí)際代碼時(shí),我會(huì)對(duì)mysql客戶端的屏幕就出現(xiàn)的代碼進(jìn)行調(diào)整,將字體改成Courier,使他們看起來(lái)與普通文本不一樣(讓大家區(qū)別程序代碼和正文)。在這里舉個(gè)例子: mysql DROP FUNCTION f;Query OK, 0 rows af
        推薦度:
        導(dǎo)讀MySQL5觸發(fā)器教程:約定和編程風(fēng)格 每次我想要演示實(shí)際代碼時(shí),我會(huì)對(duì)mysql客戶端的屏幕就出現(xiàn)的代碼進(jìn)行調(diào)整,將字體改成Courier,使他們看起來(lái)與普通文本不一樣(讓大家區(qū)別程序代碼和正文)。在這里舉個(gè)例子: mysql DROP FUNCTION f;Query OK, 0 rows af

        約定和編程風(fēng)格 每次我想要演示實(shí)際代碼時(shí),我會(huì)對(duì)mysql客戶端的屏幕就出現(xiàn)的代碼進(jìn)行調(diào)整,將字體改成Courier,使他們看起來(lái)與普通文本不一樣(讓大家區(qū)別程序代碼和正文)。在這里舉個(gè)例子: mysql DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)

        約定和編程風(fēng)格
        每次我想要演示實(shí)際代碼時(shí),我會(huì)對(duì)mysql客戶端的屏幕就出現(xiàn)的代碼進(jìn)行調(diào)整,將字體改成Courier,使他們看起來(lái)與普通文本不一樣(讓大家區(qū)別程序代碼和正文)。在這里舉個(gè)例子:
        mysql> DROP FUNCTION f;
        Query OK, 0 rows affected (0.00 sec)
        如果實(shí)例比較大,則需要在某些行和段落間加注釋,同時(shí)我會(huì)用將"<--"符號(hào)放在頁(yè)面的右邊以表示強(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è)試通過(guò)。在您閱讀本書(shū)的時(shí)候,Mysql已經(jīng)有更高的版本,同時(shí)能支持更多OS了,包括Windows,Sparc,HP-UX。因此這里的例子將能正常的運(yùn)行在您的電腦上。但如果運(yùn)行仍然出現(xiàn)故障,可以咨詢你認(rèn)識(shí)的資深Mysql用戶,這樣就能得到比較好的支持和幫助。
        為什么要用觸發(fā)器
        我們?cè)贛ySQL 5.0中包含對(duì)觸發(fā)器的支持是由于以下原因:
        MySQL早期版本的用戶長(zhǎng)期有需要觸發(fā)器的要求。
        我們?cè)?jīng)許諾支持所有ANSI標(biāo)準(zhǔn)的特性。
        您可以使用它來(lái)檢查或預(yù)防壞的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù)。
        您可以改變或者取消INSERT, UPDATE以及DELETE語(yǔ)句。
        您可以在一個(gè)會(huì)話中監(jiān)視數(shù)據(jù)改變的動(dòng)作。
        在這里我假定大家都讀過(guò)"MySQL新特性"叢書(shū)的第一集--"MySQL存儲(chǔ)過(guò)程",那么大家都應(yīng)該知道MySQL至此存儲(chǔ)過(guò)程和函數(shù),那是很重要的知識(shí),因?yàn)樵谟|發(fā)器中你可以使用在函數(shù)中使用的語(yǔ)句。特別舉個(gè)例子:
        復(fù)合語(yǔ)句(BEGIN / END)是合法的.
        流控制(Flow-of-control)語(yǔ)句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.
        變量聲明(DECLARE)以及指派(SET)是合法的.
        允許條件聲明.
        異常處理聲明也是允許的.
        但是在這里要記住函數(shù)有受限條件:不能在函數(shù)中訪問(wèn)表.
        
        因此在函數(shù)中使用以下語(yǔ)句是非法的。
        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ǔ)過(guò)程書(shū)中所說(shuō)那樣.不要在含有重要數(shù)據(jù)的數(shù)據(jù)庫(kù)中使用這個(gè)觸發(fā)器,如果需要的話在一些以測(cè)試為目的的數(shù)據(jù)庫(kù)上使用,同時(shí)在你對(duì)表創(chuàng)建觸發(fā)器時(shí)確認(rèn)這些數(shù)據(jù)庫(kù)是默認(rèn)的。
        語(yǔ)法
        1. 語(yǔ)法:命名規(guī)則
        
        CREATE TRIGGER <觸發(fā)器名稱> <--
        { BEFORE | AFTER }
        { INSERT | UPDATE | DELETE }
        ON <表名稱>
        FOR EACH ROW
        <觸發(fā)器SQL語(yǔ)句>
        
        觸發(fā)器必須有名字,最多64個(gè)字符,可能后面會(huì)附有分隔符.它和MySQL中其他對(duì)象的命名方式基本相象.
        這里我有個(gè)習(xí)慣:就是用表的名字+'_'+觸發(fā)器類型的縮寫(xiě).因此如果是表t26,觸發(fā)器是在事件UPDATE(參考下面的點(diǎn)(2)和(3))之前(BEFORE)的,那么它的名字就是t26_bu。
        2. 語(yǔ)法:觸發(fā)時(shí)間
        
        CREATE TRIGGER <觸發(fā)器名稱>
        { BEFORE | AFTER } <--
        { INSERT | UPDATE | DELETE }
        ON <表名稱>
        FOR EACH ROW
        <觸發(fā)的SQL語(yǔ)句>
        
        觸發(fā)器有執(zhí)行的時(shí)間設(shè)置:可以設(shè)置為事件發(fā)生前或后。
        
        3. 語(yǔ)法:事件
        
        CREATE TRIGGER <觸發(fā)器名稱>
        { BEFORE | AFTER }
        { INSERT | UPDATE | DELETE } <--
        ON <表名稱>
        FOR EACH ROW
        <觸發(fā)的SQL語(yǔ)句>
        
        同樣也能設(shè)定觸發(fā)的事件:它們可以在執(zhí)行insert、update或delete的過(guò)程中觸發(fā)。
        4. 語(yǔ)法:表
        
        CREATE TRIGGER <觸發(fā)器名稱>
        { BEFORE | AFTER }
        { INSERT | UPDATE | DELETE }
        ON <表名稱> <--
        FOR EACH ROW
        <觸發(fā)的SQL語(yǔ)句>
        
        觸發(fā)器是屬于某一個(gè)表的:當(dāng)在這個(gè)表上執(zhí)行插入、
        更新或刪除操作的時(shí)候就導(dǎo)致觸發(fā)器的激活.
        我們不能給同一張表的同一個(gè)事件安排兩個(gè)觸發(fā)器。
        
        5. 語(yǔ)法:( 步長(zhǎng))觸發(fā)間隔
        
        CREATE TRIGGER <觸發(fā)器名稱>
        { BEFORE | AFTER }
        { INSERT | UPDATE | DELETE }
        ON <表名稱>
        FOR EACH ROW <--
        <觸發(fā)的SQL語(yǔ)句>
        
        觸發(fā)器的執(zhí)行間隔:FOR EACH ROW子句通知觸發(fā)器
        每隔一行執(zhí)行一次動(dòng)作,而不是對(duì)整個(gè)表執(zhí)行一次。
        
        6. 語(yǔ)法:語(yǔ)句
        
        CREATE TRIGGER <觸發(fā)器名稱>
        { BEFORE | AFTER }
        { INSERT | UPDATE | DELETE }
        ON <表名稱>
        FOR EACH ROW
        <觸發(fā)的SQL語(yǔ)句> <--
        
        觸發(fā)器包含所要觸發(fā)的SQL語(yǔ)句:這里的語(yǔ)句可以是任何合法的語(yǔ)句,
        包括復(fù)合語(yǔ)句,但是這里的語(yǔ)句受的限制和函數(shù)的一樣。
        Privileges權(quán)限
        
        你必須擁有相當(dāng)大的權(quán)限才能創(chuàng)建觸發(fā)器(CREATE TRIGGER)。
        如果你已經(jīng)是Root用戶,那么就足夠了。這跟SQL的標(biāo)準(zhǔn)有所不同。
        
        因此在下一個(gè)版本的MySQL中,
        你完全有可能看到有一種叫做CREATE TRIGGER的新權(quán)限。
        然后通過(guò)這樣的方法賦予:
        GRANT CREATE TRIGGER ON <表名稱> TO <用戶或用戶列表>;
        也可以通過(guò)這樣收回權(quán)限:
        REVOKE CREATE TRIGGER ON <表名稱> FROM <用戶或用戶列表>;
        
        關(guān)于舊的和新創(chuàng)建的列的標(biāo)識(shí)
        在觸發(fā)器的SQL語(yǔ)句中,你可以關(guān)聯(lián)表中的任意列。但你不能僅使用列的名稱去標(biāo)識(shí),那會(huì)使系統(tǒng)混淆,因?yàn)槟抢锟赡軙?huì)有列的新名(這可能正是你要修改的,你的動(dòng)作可能正是要修改列名),還有列的舊名存在。因此你必須用這樣的語(yǔ)法來(lái)標(biāo)識(shí): "NEW . column_name"或者"OLD . column_name".這樣在技術(shù)上處理(NEW | OLD . column_name)新和舊的列名屬于創(chuàng)建了過(guò)渡變量("transition variables")。
        對(duì)于INSERT語(yǔ)句,只有NEW是合法的;對(duì)于DELETE語(yǔ)句,只有OLD才合法;而UPDATE語(yǔ)句可以在和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的例子
        創(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;//
        
        在最開(kāi)始我創(chuàng)建了一個(gè)名字為t22的表,然后在表t22上創(chuàng)建了一個(gè)觸發(fā)器t22_bi,當(dāng)我們要向表中的行插入時(shí),觸發(fā)器就會(huì)被激活,執(zhí)行將s1列的值改為55的動(dòng)作。
        使用觸發(fā)器執(zhí)行插入動(dòng)作
        mysql> INSERT INTO t22 VALUES (1)//
        讓我們看如果向表t2中插入一行數(shù)據(jù)觸發(fā)器對(duì)應(yīng)的表會(huì)怎么樣? 這里的插入的動(dòng)作是很常見(jiàn)的,我們不需要觸發(fā)器的權(quán)限來(lái)執(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ù)不是我們開(kāi)始輸入的插入數(shù)據(jù),而是觸發(fā)器自己的數(shù)據(jù)。
        "check"完整性約束例子
        什么是"check"約束
        在標(biāo)準(zhǔn)的SQL語(yǔ)言中,我們可以在(CREATE TABLE)創(chuàng)建表的過(guò)程中使用"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語(yǔ)句都會(huì)非法",MySQL的視圖不支持CHECK,我個(gè)人是很希望它能支持的。但如果你很需要在表中使用這樣的功能,我建議大家使用觸發(fā)器來(lái)實(shí)現(xiàn)。
        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語(yǔ)句就行了,刪除了觸發(fā)器不會(huì)對(duì)表有影響,同時(shí)AFTER的觸發(fā)器也不能修改NEW的過(guò)程變量(transition variables)。為了激活觸發(fā)器,我執(zhí)行了向表中的行插入s1=0的數(shù)據(jù),之后只要執(zhí)行符合LEFT(s2,1) <> 'A'條件的動(dòng)作都會(huì)失敗:
        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è)了
        我在這里警告大家不要相信過(guò)去的MySQL手冊(cè)中所說(shuō)的了。我們已經(jīng)去掉了關(guān)于觸發(fā)器的錯(cuò)誤的語(yǔ)句,但是仍舊有很多舊版本的手冊(cè)在網(wǎng)上,舉個(gè)例子,這是一個(gè)德國(guó)的Url上的: http://dev.mysql.com/doc/mysql/de/ANSI_diff_Triggers.html.  這個(gè)手冊(cè)上說(shuō)觸發(fā)器就是存儲(chǔ)過(guò)程,忘掉吧,你也已經(jīng)看見(jiàn)了,觸發(fā)器就是觸發(fā)器,而存儲(chǔ)過(guò)程還是存儲(chǔ)過(guò)程。 手冊(cè)上還說(shuō)觸發(fā)器可以從其他表上來(lái)刪除,或者是當(dāng)你刪除一個(gè)事務(wù)的時(shí)候激發(fā),無(wú)論他說(shuō)的是什么意思,忘掉吧,MySQL不會(huì)去實(shí)現(xiàn)這些的。 最后關(guān)于說(shuō)使用觸發(fā)器會(huì)對(duì)查詢速度產(chǎn)生影響的說(shuō)法也是錯(cuò)的,觸發(fā)器不會(huì)對(duì)查詢產(chǎn)生任何影響。

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        MySQL5觸發(fā)器教程

        MySQL5觸發(fā)器教程:約定和編程風(fēng)格 每次我想要演示實(shí)際代碼時(shí),我會(huì)對(duì)mysql客戶端的屏幕就出現(xiàn)的代碼進(jìn)行調(diào)整,將字體改成Courier,使他們看起來(lái)與普通文本不一樣(讓大家區(qū)別程序代碼和正文)。在這里舉個(gè)例子: mysql DROP FUNCTION f;Query OK, 0 rows af
        推薦度:
        標(biāo)簽: 教程 想要 每次
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产午夜无码精品免费看动漫| 永久在线免费观看| 在线免费观看一级片| 国产精品二区三区免费播放心 | 久久精品国产亚洲5555| 亚洲宅男永久在线| 在线成人爽a毛片免费软件| 亚洲成A人片在线观看无码3D| 国产精品亚洲а∨无码播放麻豆| 免费特级黄毛片在线成人观看 | 亚洲av无码一区二区乱子伦as| 国产裸体美女永久免费无遮挡| 免费福利网站在线观看| 亚洲无人区视频大全| 成年男女男精品免费视频网站| 亚洲一区二区三区夜色| 69式互添免费视频| 亚洲日韩一区二区一无码| 免费成人在线视频观看| 久久久久亚洲av无码专区导航| h视频在线观看免费网站| 亚洲最大天堂无码精品区| 99久久精品免费精品国产| 亚洲国产美女在线观看| 大香人蕉免费视频75| 免费国产在线精品一区| 亚洲乱码一区二区三区在线观看| 国产激情免费视频在线观看| 亚洲AV无码成人专区| 在线观看成人免费视频不卡| 亚洲私人无码综合久久网| 亚洲AV无码专区日韩| 久久青草精品38国产免费| 亚洲偷偷自拍高清| 在线观看无码AV网站永久免费| 亚洲AV无码一区二区三区牲色 | 亚洲国产成人久久综合野外| 国产裸体美女永久免费无遮挡| 亚洲妓女综合网99| 亚洲A∨午夜成人片精品网站| 99re6免费视频|