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)缺陷.所以我在這裡給大家警告,就像我在預存程序書中所說那樣.不要在含有重要資料的資料庫中使用這個觸發器,如果需要的話在一些以測試為目的的資料庫上使用,同時在你對錶建立觸發器時確認這些資料庫是預設的。