Introduction 簡介
YI,Pj`T5 pC/ 0'% MySQL 5.0 新特性教程是為需要了解5.0版本新特性的MySQL老用戶而寫的。簡單的來說是介紹了“存儲過程、觸發(fā)器、視圖、信息架構(gòu)視圖”,在此感謝譯者陳朋奕的努力.
,J1|.b 5 v+931ZV*q 希望這本書能像內(nèi)行專家那樣與您進行對話,用簡單的問題、例子讓你學到需要的知識。為了達到這樣的目的,我會從每一個細節(jié)開始慢慢的為大家建立概念,最后會給大家展示較大的實用例,在學習之前也許大家會認為這個用例很難,但是只要跟著課程去學,相信很快就能掌握。
E{sA7 v6grz{ { Conventions and Styles 約定和編程風格
"t-_2T%h P<H$M. 每次我想要演示實際代碼時,我會對mysql客戶端的屏幕就出現(xiàn)的代碼進行調(diào)整,將字體改成Courier,使他們看起來與普通文本不一樣。
M6B~by ^,MA5pj5v 在這里舉個例子:mysql> DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)
.~nSXEu Kl,#% 如果實例比較大,則需要在某些行和段落間加注釋,同時我會用將“<--”符號放在頁面的右邊以表示強調(diào)。
nkqQqTv7 W.-!>mU 例如:
2U"eF[1%G ; {Re614hd mAt{h?G92 mysql> CREATE PROCEDURE p ()
e8 [j&Pin -> BEGIN
x4U & -> /* This procedure does nothing */ <--
W,bCf3b{3 -> END;//Query OK, 0 rows affected (0.00 sec)
R g|\}' \ K+f*~> ,d:H9VB 有時候我會將例子中的"mysql>"和"->"這些系統(tǒng)顯示去掉,你可以直接將代碼復制到mysql客戶端程序中(如果你現(xiàn)在所讀的不是電子版的,可以在mysql.com網(wǎng)站下載相關(guān)腳本)所以的例子都已經(jīng)在Suse 9.2 Linux、Mysql 5.0.3公共版上測試通過。
melM%o ';4(|M4% 在您閱讀本書的時候,Mysql已經(jīng)有更高的版本,同時能支持更多OS了,包括Windows,Sparc,HP-UX。因此這里的例子將能正常的運行在您的電腦上。但如果運行仍然出現(xiàn)故障,可以咨詢你認識的資深Mysql用戶,以得到長久的支持和幫助。
B<Q])^~I` Why MySQL Statements are Legal in a Procedure Body
z B'CzZ] 什么MySQL語句在存儲過程體中是合法的?
[.G 5y>,m% /]jP< l\ 什么樣的SQL語句在Mysql存儲過程中才是合法的呢?你可以創(chuàng)建一個包含INSERT, UPDATE,DELETE, SELECT, DROP, CREATE, REPLACE等的語句。你唯一需要記住的是如果代碼中包含MySQL擴充功能,那么代碼將不能移植。在標準SQL語句中:任何數(shù)據(jù)庫定義語言都是合法的,如:
C%r Y!V4) )I" BEz;Q8; ?-2}9D!: _(8)ETMb CREATE PROCEDURE p () DELETE FROM t; //
JR%GJ1'2q2 lGs?i 2 4K SET、COMMIT以及ROLLBACK也是合法的,如:
I7iDsM t(!*x7F>PK FxD%+&E7H CREATE PROCEDURE p () SET @x = 5; //
2B;hZ'A _7ruKxZY F)c |OMH MySQL的附加功能:任何數(shù)據(jù)操作語言的語句都將合法。
E mh D6) GJR.P^7t%! =4KN 0v4 CREATE PROCEDURE p () DROP TABLE t; //
)T@9ue4 ]Az"WF^; Qok ( MySQL擴充功能:直接的SELECT也是合法的:
uQ.uOkq` pD& T3s1 j&1o&2LD CREATE PROCEDURE p () SELECT 'a'; //
TY_UUmRDs EZd&R1xp 5ls[l}PxY 順便提一下,我將存儲過程中包括DDL語句的功能稱為MySQL附加功能的原因是在SQL標準中把這個定義為非核心的,即可選組件。
O|K@/H!` "~!6Tw:9KS rz]sMTDN] The New SQL Statements 新SQL語句
s Dj>ZG"' J4{z"\ Variables 變量
i;>6? O /BHC)VxUu 在復合語句中聲明變量的指令是DECLARE。
y3D[^ Q6T@cyVG (1) Example with two DECLARE statements
'djnaVKz:! ^>M[c_ Z 兩個DECLARE語句的例子
O )V4`tN# f|tJ\Y,Ss qcN-pc4 pcA_7@L Fzlmm7% ;_iIl '7WWbz0rR CREATE PROCEDURE p8 ()
:q:?9 T[ !oG BEGIN
2< M\`+a @b}oh#\r DECLARE a INT;
F%nx() sergz+BW% DECLARE b INT;
9UEM8Z;bE9 n!P7?]t SET a = 5;
%$V]UQ_Q c"-#[>JA SET b = 5;
TX.!\{%) 1zOWZ? INSERT INTO t VALUES (a);
8
0bjYy,e
SELECT s1 * a FROM t WHERE s1 >= b; _" !)p vD
ac5app:}s
END; // /* I won't CALL this */ /=ws*#R(
=F6|gM.
#c5k@4?+k
在過程中定義的變量并不是真正的定義,你只是在BEGIN/END塊內(nèi)定義了而已(譯注:也就是形參)。 3/p'1;
m 42*
Error Handling 異常處理 hO~- K.h]
g&%saj(,
好了,我們現(xiàn)在要講的是異常處理 cB2i%k'z[t
^Lj)'[\)v(
1. Sample Problem: Log Of Failures 問題樣例:故障記錄 p
.e%zd]$
當INSERT失敗時,我希望能將其記錄在日志文件中我們用來展示出錯處理的問題樣例是很 UVdF}H5L
普通的。我希望得到錯誤的記錄。當INSERT失敗時,我想在另一個文件中記下這些錯誤的 v.$m0&
信息,例如出錯時間,出錯原因等。我對插入特別感興趣的原因是它將違反外鍵關(guān)聯(lián)的約束 M-w#i`WP$=
]KI OY
2. Sample Problem: Log Of Failures (2) !jd]|3d^*j
/+46)>\D
mysql> CREATE TABLE t2 tW]6
s1 INT, PRIMARY KEY (s1)) 7H!n8?d~
engine=innodb;// <31!KM)
mysql> CREATE TABLE t3 (s1 INT, KEY (s1), h1p6c,][y
FOREIGN KEY (s1) REFERENCES t2 (s1)) ohHl%*xU43
engine=innodb;// @rDJk6
mysql> INSERT INTO t3 VALUES (5);// 95xwsMC
... }9D'f5bX
ERROR 1216 (23000): Cannot add or update a child row: a foreign key <;@wldJ} N
constraint fails(這里顯示的是系統(tǒng)的出錯信息) SDPQ8
~cl&G
*:+*](] o
我開始要創(chuàng)建一個主鍵表,以及一個外鍵表。我們使用的是InnoDB,因此外鍵關(guān)聯(lián)檢查是打 u=mQ4# U
開的。然后當我向外鍵表中插入非主鍵表中的值時,動作將會失敗。當然這種條件下可以很 TR { #rc
快找到錯誤號1216。 VR{X!:1+
7gg"-;o`UU
3. Sample Problem: Log Of Failures ~d4m/ P
ND;973UFs
{f>Va{B
CREATE TABLE error_log (error_message zVj6_/}1M
CHAR(80))// pWd`7fBt
NT@Z5,|!
下一步就是建立一個在做插入動作出錯時存儲錯誤的表。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com