搜尋
首頁資料庫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 secrows affed (有時候我會將例子中的"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, 也是合法的.

  變數宣告(DECLARE)以及指派(SET)是合法的.

  允許條件聲明.

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

   在這裡要異常處理聲明也是允許的.

   在這裡要有限條件存取表.因此在函數中使用以下語句是非法的。


ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE

DROP 'FLUSH PRIVILEGES' GRANT INSERT KILL

LOCK OPTIMIZE REPAIR REPLACE REVOKE​​table Sleft/T ' 'SET TRANSACTION'

SHOW 'START TRANSACTION' TRUNCATE UPDATE

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

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

Syntax 語法

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

CREATE TRIGGER { BEFORE | AFTER }{ INSERT | EACH ROW



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

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

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

CREATE TRIGGER

{ BEFORE | AFTER } { INSERT |
  觸發器有執行的時間設定:可以設定為事件發生前或後。


  3. Syntax: Event語法:事件


CREATE TRIGGER
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE } ON 的SQL語句>

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

  4. Syntax: Table 語法:表


CREATE TRIGGER
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON FOR EACH ROW

〜㟀一個表的:當在這個表上執行插入、更新或刪除操作的時候就導致觸發器的激活.

我們不能給同一張表的同一個事件安排兩個觸發器。

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

CREATE TRIGGER
{ BEFORE | AFTER }
{ INSERT | UPDATEATE | ROW

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

CREATE TRIGGER

{ BEFORE | AFTER }

{ INSERT | UPDATE | DELETE }

ON

FOR EACH ROW
FROM ;

Referring to OLD and NEW columns 關於舊的和新建立的列的識別

  在觸發器的SQL語句中,你可以關聯表中的任意列。還有列的舊名存在。創建了過渡變數("transition variables")。下面是一個UPDATE同時使用NEW和OLD的例子。

CREATE TRIGGER t21_au

BEFORE UPDATE ON t22

FOR EACH ROW

BEGIN

SET @old = OLD . s1;

SET @new = NEW.s1;的值是55,那麼執行了"UPDATE t21 SET s1 = s1 + 1"之後@old的值會變成55,而@new的值將會變成56。

Example of CREATE and INSERT CREATE和INSERT的例子


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

  這裡所有的例程中我都假定為大家的分隔符號已經設定成大家的分隔符號已經設定成每個分隔符號。


CREATE TABLE t22 (s1 INTEGER)//

CREATE TRIGGER t22_bi

BEFORE INSERT ON t22

FOR EACH ROW

BEGINEND" ;//

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

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



m​​ysql> INSERT INTO t22 VALUES (1)//

  讓我們看如果向觸發器22 對應器對應樣?

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

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"約束

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

 AB]在建立在表的標準類型的語言中,我們可以在建立標準的標準表)過程中使用"CHECK (condition)",

例如:


CREATE TABLE t25
(s1 INT, s2 CHAR(5), PRIMARY KEY (s1),
CHECK (LEFT(s2,1)='A'))
ENGINE=INNODB;當s2列的最左邊的字元不是'A'時,insert和update語句都會非法",MySQL的視圖不支援CHECK,我個人是很希望它能支援的。但如果你很需要在表中使用這樣的功能,我建議大家使用觸發器來實現。

CREATE TABLE t25

(s1 INT, s2 CHAR(5),
PRIMARY KEY (s1))
ENGINE=INNODB//

CREATE TRIGGER t25_BEF. 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)

  我只需要使用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.comfor 'trigger' that for'thath.com for'大. 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。 to work around them when you're trying triggers.


  Bug#5859 DROP TABLE does not drop triggers.
  (刪除表的時候沒有自動刪除觸發器 drop triggers.
  (刪除表的時候沒有自動刪除觸發器)table)
〟 youd 影響々table, catt)table, w005h left matic .

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


  Bug#5894 Triggers with altered tables datacadruprupc〜.資料被破壞)
  Do not alter a table that has a trigger on it, until you know this is fixed.

Conclusion 最後


  到了書的最後,我認為不需要給大家重溫了因為相信大家可以很輕鬆的記住上面所說的。

 以上是MySQL 5.0 新功能教學 觸發器:第一講的內容,更多相關內容請關注PHP中文網(www.php.cn) !


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。