国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

MySQL5.0觸發器

來源:懂視網 責編:小采 時間:2020-11-09 07:46:17
文檔

MySQL5.0觸發器

MySQL5.0觸發器:Introduction 本書是為需要了解5.0版本新特性的MySQL老用戶而寫的。簡單的來說介紹了存儲過程、觸發器、視圖、信息架構視圖,這是介紹MySQL 5.0新特性叢書的第一集。希望這本書能像內行專家那樣與您進行對話,用簡單的問題、例子讓你學到需要的知識。為了達
推薦度:
導讀MySQL5.0觸發器:Introduction 本書是為需要了解5.0版本新特性的MySQL老用戶而寫的。簡單的來說介紹了存儲過程、觸發器、視圖、信息架構視圖,這是介紹MySQL 5.0新特性叢書的第一集。希望這本書能像內行專家那樣與您進行對話,用簡單的問題、例子讓你學到需要的知識。為了達

Introduction 本書是為需要了解5.0版本新特性的MySQL老用戶而寫的。簡單的來說介紹了存儲過程、觸發器、視圖、信息架構視圖,這是介紹MySQL 5.0新特性叢書的第一集。希望這本書能像內行專家那樣與您進行對話,用簡單的問題、例子讓你學到需要的知識。為了達

Introduction

本書是為需要了解5.0版本新特性的MySQL老用戶而寫的。簡單的來說介紹了"存儲過程、觸發器、視圖、信息架構視圖",這是介紹MySQL 5.0新特性叢書的第一集。希望這本書能像內行專家那樣與您進行對話,用簡單的問題、例子讓你學到需要的知識。為了達到這樣的目的,我會從每一個細節開始慢的為大家建立概念,最后會給大家展示較大的實用例,在學習之前也許大家會認為這個用例很難,但是只要跟著課程去學,相信很快就能掌握。


Conventions and Styles約定和編程風格

每次我想要演示實際代碼時,我會對mysql客戶端的屏幕就出現的代碼進行調整,將字體改成Courier,使他們看起來與普通文本不一樣(讓大家區別程序代碼和正文)。在這里舉個例子:


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


如果實例比較大,則需要在某些行和段落間加注釋,同時我會用將"<--"符號放在頁面的右邊以表示強調。例如:


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


有時候我會將例子中的"mysql>"和"->"這些系統顯示去掉,你可以直接將代碼復制到mysql客戶端程序中(如果你現在所讀的不是電子版的,可以在mysql.com網站下載相關腳本)


所以的例子都已經在Suse 9.2 Linux、Mysql 5.0.3公共版上測試通過。在您閱讀本書的時候,Mysql已經有更高的版本,同時能支持更多OS了,包括Windows,Sparc,HP-UX。因此這里的
例子將能正常的運行在您的電腦上。但如果運行仍然出現故障,可以咨詢你認識的資深Mysql用戶,這樣就能得到比較好的支持和幫助。


Why Triggers 為什么要用觸發器


我們在MySQL 5.0中包含對觸發器的支持是由于以下原因:


MySQL早期版本的用戶長期有需要觸發器的要求。
我們曾經許諾支持所有ANSI標準的特性。
您可以使用它來檢查或預防壞的數據進入數據庫。
您可以改變或者取消INSERT, UPDATE以及DELETE語句。
您可以在一個會話中監視數據改變的動作。

在這里我假定大家都讀過"MySQL新特性"叢書的第一集--"MySQL存儲過程",那么大家都應該知道MySQL至此存儲過程和函數,那是很重要的知識,因為在觸發器中你可以使用在函數中使用的語句。特別舉個例子:


復合語句(BEGIN / END)是合法的.

流控制(Flow-of-control)語句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.

變量聲明(DECLARE)以及指派(SET)是合法的.

允許條件聲明.

異常處理聲明也是允許的.


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


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


在觸發器中也有完全一樣的限制.


觸發器相對而言比較新,因此會有(bugs)缺陷.所以我在這里給大家警告,就像我在存儲過程書中所說那樣.不要在含有重要數據的數據庫中使用這個觸發器,如果需要的話在一些以測試為目的的數據庫上使用,同時在你對表創建觸發器時確認這些數據庫是默認的。

Syntax 語法

1. Syntax: Name 語法:命名規則


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


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


這里我有個習慣:就是用表的名字+'_'+觸發器類型的縮寫.因此如果是表t26,觸發器是在事件UPDATE(參考下面的點(2)和(3))之前(BEFORE)的,那么它的名字就是t26_bu。

2. Syntax: Time 語法:觸發時間


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


觸發器有執行的時間設置:可以設置為事件發生前或后。

3. Syntax: Event語法:事件


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


同樣也能設定觸發的事件:它們可以在執行insert、update或delete的過程中觸發。

4. Syntax: Table 語法:表


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


觸發器是屬于某一個表的:當在這個表上執行插入、更新或刪除操作的時候就導致觸發器的激活.
我們不能給同一張表的同一個事件安排兩個觸發器。

5. Syntax: Granularity 語法:( :( 步長)觸發間隔

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

觸發器的執行間隔:FOR EACH ROW子句通知觸發器每隔一行執行一次動作,而不是對整個表執行一次。


6. Syntax: Statement 語法:語句


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

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

Privileges權限


你必須擁有相當大的權限才能創建觸發器(CREATE TRIGGER)。如果你已經是Root用戶,那么就足夠了。這跟SQL的標準有所不同,我也希望能盡快改成標準的。


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


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


也可以通過這樣收回權限:


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


Referring to OLD and NEW columns 關于舊的和新創建的列的標識


在觸發器的SQL語句中,你可以關聯表中的任意列。但你不能僅使用列的名稱去標識,那會使系統混淆,因為那里可能會有列的新名(這可能正是你要修改的,你的動作可能正是要修改列名),還有列的舊名存在。因此你必須用這樣的語法來標識:

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


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


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


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


Example of CREATE and INSERT CREATE和INSERT的例子


CREATE table with trigger創建有觸發器的表


這里所有的例程中我都假定大家的分隔符已經設置成//(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;//


在最開始我創建了一個名字為t22的表,然后在表t22上創建了一個觸發器t22_bi,當我們要向表中的行插入時,觸發器就會被激活,執行將s1列的值改為55的動作。

INSERT on table w ith a trigger使用觸發器執行插入動作


mysql> INSERT INTO t22 VALUES (1)//


讓我們看如果向表t2中插入一行數據觸發器對應的表會怎么樣?


這里的插入的動作是很常見的,我們不需要觸發器的權限來執行它。甚至不需要知道是否有觸發器關聯。


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


大家可以看到INSERT動作之后的結果,和我們預期的一樣,x標記被改動了,同時這里插入的數據不是我們開始輸入的插入數據,而是觸發器自己的數據。

Example of a "check" constraint
"check"完整性約束例子


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


在標準的SQL語言中,我們可以在(CREATE TABLE)創建表的過程中使用"CHECK (condition)",
例如:

CREATE TABLE t25
(s1 INT, s2 CHAR(5), PRIMARY KEY (s1),
CHECK (LEFT(s2,1)='A'))
ENGINE=INNODB;


這里CHECK的意思是"當s2列的最左邊的字符不是'A'時,insert和update語句都會非法",MySQL的視圖不支持CHECK,我個人是很希望它能支持的。但如果你很需要在表中使用這樣的功能,我建議大家使用觸發器來實現。


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語句就行了,刪除了觸發器不會對表有影響,同時AFTER的觸發器也不能修改NEW的過程變量(transition variables)。為了激活觸發器,我執行了向表中的行插入s1=0的數據,之后只要執行符合LEFT(s2,1) <> 'A'條件的動作都會失敗:


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的手冊了

我在這里警告大家不要相信過去的MySQL手冊中所說的了。我們已經去掉了關于觸發器的錯誤的語句,但是仍舊有很多舊版本的手冊在網上,舉個例子,這是一個德國的Url上的:
http://dev.mysql.com/doc/mysql/de/ANSI_diff_Triggers.html.


這個手冊上說觸發器就是存儲過程,忘掉吧,你也已經看見了,觸發器就是觸發器,而存儲過程還是存儲過程。


手冊上還說觸發器可以從其他表上來刪除,或者是當你刪除一個事務的時候激發,無論他說的是什么意思,忘掉吧,MySQL不會去實現這些的。


最后關于說使用觸發器會對查詢速度產生影響的說法也是錯的,觸發器不會對查詢產生任何影響。

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.
(刪除表的時候沒有自動刪除觸發器)
When you drop a table, dropping the table's triggers should be automatic.


Bug#5892 Triggers have the wrong namespace.
(觸發器的命名空間有錯,你必須在前面加上表的名字才能刪除觸發器,下面是例子)
You have to say "DROP TRIGGER

. ".
The correct way is "DROP TRIGGER ".


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

Conclusion 最后


到了書的最后,我認為不需要給大家復習或者是重溫一下了,因為相信大家可以很輕松的記住上面所說的。


如果你喜歡這本書,那么你可以去找"MySQL 5.0系列"其他書,較早的一本是關于"存儲過程"的,下一本將會是關于"視圖"的。


感謝您的關注,如果您對書有什么建議,可以在MySQL論壇上發言,下面是地址:
http://forums.mysql.com

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

MySQL5.0觸發器

MySQL5.0觸發器:Introduction 本書是為需要了解5.0版本新特性的MySQL老用戶而寫的。簡單的來說介紹了存儲過程、觸發器、視圖、信息架構視圖,這是介紹MySQL 5.0新特性叢書的第一集。希望這本書能像內行專家那樣與您進行對話,用簡單的問題、例子讓你學到需要的知識。為了達
推薦度:
標簽: 5.0 觸發器 mysql
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

Top
主站蜘蛛池模板: 一级毛片黄| 久久91精品国产91 | 日韩亚洲欧美在线 | 特级一级全黄毛片免费 | 欧美成人伊人久久综合网 | 久久91精品久久91综合 | 亚洲v欧美 | va欧美国产在线视频 | 另类日韩 | 久久99精品国产99久久 | 国产69精品久久久久99不卡 | 222aaa免费国产在线观看 | 无毛片 | 久久精品国产精品亚洲综合 | 韩国视频网站 | 亚洲欧美日本在线观看 | 国内精品久久久久久中文字幕 | 91精品一区二区三区在线观看 | 国产日韩欧美自拍 | 欧美日韩亚洲第一页 | 亚洲欧美天堂 | 午夜精品一区二区三区在线视 | 国产精品成人久久久 | 亚洲国产精久久久久久久 | 激情欧美在线 | 图片亚洲va欧美va国产综合 | 精品国产免费一区二区三区五区 | 国产免费三a在线 | 国语对白一区二区三区 | 九九热这里有精品 | 亚洲 另类 在线 欧美 制服 | 91精品一区二区三区在线观看 | 日韩第一页在线 | 国产区精品 | 免费黄毛片 | 日本久热 | 美日韩在线视频 | 制服丝袜一区 | 久久久一区二区三区 | 毛片综合| 欧美 国产 日韩 第一页 |