Introduction 簡介 MySQL
新特性教程是為需要了解
版本新特性的MySQL老用戶而寫的
簡單的來說是介紹了
存儲過程
觸發器
視圖
信息架構視圖
在此感謝譯者陳朋奕的努力
希望這本書能像內行專家那樣與您進行對話
用簡單的問題
例子讓你學到需要的知識
為了達到這樣的目的
我會從每一個細節開始慢慢的為大家建立概念
最後會給大家展示較大的實用例
在學習之前也許大家會認為這個用例很難
但是只要跟著課程去學
相信很快就能掌握
Conventions and Styles 約定和編程風格 每次我想要演示實際代碼時
我會對mysql客戶端的屏幕就出現的代碼進行調整
將字體改成Courier
使他們看起來與普通文本不一樣
在這裡舉個例子
mysql> DROP FUNCTION f;Query OK
rows affected (
sec)
如果實例比較大
則需要在某些行和段落間加注釋
同時我會用將
<
符號放在頁面的右邊以表示強調
例如
mysql> CREATE PROCEDURE p ()
> BEGIN
> /* This procedure does nothing */ <
> END;//Query OK
rows affected (
sec)
有時候我會將例子中的
mysql>
和
>
這些系統顯示去掉
你可以直接將代碼復制到mysql客戶端程序中(如果你現在所讀的不是電子版的
可以在網站下載相關腳本)所以的例子都已經在Suse
Linux
Mysql
公共版上測試通過
在您閱讀本書的時候
Mysql已經有更高的版本
同時能支持更多OS了
包括Windows
Sparc
HP
UX
因此這裡的例子將能正常的運行在您的電腦上
但如果運行仍然出現故障
可以咨詢你認識的資深Mysql用戶
以得到長久的支持和幫助
A Definition and an Example 定義及實例 定義及實例存儲過程是一種存儲在書庫中的程序(就像正規語言裡的子程序一樣)
准確的來說
MySQL支持的
routines(例程)
有兩種
一是我們說的存儲過程
二是在其他SQL語句中可以返回值的函數(使用起來和Mysql預裝載的函數一樣
如pi())
我在本書裡面會更經常使用存儲過程
因為這是我們過去的習慣
相信大家也會接受
一個存儲過程包括名字
參數列表
以及可以包括很多SQL語句的SQL語句集
在這裡對局部變量
異常處理
循環控制和IF條件句有新的語法定義
下面是一個包括存儲過程的實例聲明
(譯注
為了方便閱讀
此後的程序不添任何中文注釋)
CREATE PROCEDURE procedure
/* name存儲過程名*/
(IN parameter
INTEGER) /* parameters參數*/
BEGIN /* start of block語句塊頭*/
DECLARE variable
CHAR(
); /* variables變量聲明*/
IF parameter
=
THEN /* start of IF IF條件開始*/
SET variable
=
birds
; /* assignment賦值*/
ELSE
SET variable
=
beasts
; /* assignment賦值*/
END IF; /* end of IF IF結束*/
INSERT INTO table
VALUES (variable
);/* statement SQL語句*/
END /* end of block語句塊結束*/
下面我將會介紹你可以利用存儲過程做的工作的所有細節
同時我們將介紹新的數據庫對象—觸發器
因為觸發器和存儲過程的關聯是必然的
Why Stored Procedures 為什麼要用存儲過程 由於存儲過程對於MySQL來說是新的功能
很自然的在使用時你需要更加注意
畢竟
在此之前沒有任何人使用過
也沒有很多大量的有經驗的用戶來帶你走他們走過的路
然而你應該開始考慮把現有程序(可能在服務器應用程序中
用戶自定義函數(UDF)中
或是腳本中)轉移到存儲過程中來
這樣做不需要原因
你不得不去做
因為存儲過程是已經被認證的技術!雖然在Mysql中它是新的
但是相同功能的函數在其他DBMS中早已存在
而它們的語法往是相同的
因此你可以從其他人那裡獲得這些概念
也有很多你可以咨詢或者雇用的經驗用戶
還有許多第三方的文檔可供你閱讀
存儲過程會使系統運行更快!雖然我們暫時不能在Mysql上證明這個優勢
用戶得到的體驗也不一樣
我們可以說的就是Mysql服務器在緩存機制上做了改進
就像Preparedstatements(預處理語句)所做的那樣
由於沒有編譯器
因此SQL存儲過程不會像外部語言(如C)編寫的程序運行起來那麼快
但是提升速度的主要方法卻在於能否降低網絡信息流量
如果你需要處理的是需要檢查
循環
多語句但沒有用戶交互的重復性任務
你就可以使用保存在服務器上的存儲過程來完成
這樣在執行任務的每一步時服務器和客戶端之間就沒那麼多的信息來往了
所以存儲過程是可復用的組件!想象一下如果你改變了主機的語言
這對存儲過程不會產生影響
因為它是數據庫邏輯而不是應用程序
存儲過程是可以移植的!當你用SQL編寫存儲過程時
你就知道它可以運行在Mysql支持的任何平台上
不需要你額外添加運行環境包
也不需要為程序在操作系統中執行設置許可
或者為你的不同型號的電腦存儲過程將被保存!如果你編寫好了一個程序
例如顯示銀行事物處理中的支票撤消
那想要了解支票的人就可以找到你的程序
它會以源代碼的形式保存在數據庫中
這將使數據和處理數據的進程有意義的關聯這可能跟你在課上聽到的規劃論中說的一樣
存儲過程可以遷移!
Mysql完全支持SQL
標准
某些數據庫(如DB
Mimer)同樣支持
但也有部分不支持的
如Oracle
SQL Server不支持
我們將會給予足夠幫助和工具
使為其他DBMS編寫的代碼能更容易轉移到Mysql上
Setting up with MySQL 設置並開始MySQL 服務 通過
mysql_fix_privilege_tables
或者
~/mysql
/scripts/mysql_install_db
來開始MySQL服務
作為我們練習的准備工作的一部分
我假定MySQL
已經安裝
如果沒有數據庫管理員為你安裝好數據庫以及其他軟件
你就需要自己去安裝了
不過你很容易忘掉一件事
那就是你需要有一個名為mysql
proc的表
在安裝了最新版本後
你必須運行
mysql_fix_privilege_tables
或者
mysql_install_db
(只需要運行其中一個就夠了)——不然存儲過程將不能工作
我同時啟用在root身份後運行一個非正式的SQL腳本
如下
mysql>source/home/pgulutzan/mysql
/scripts/mysql_prepare_privilege_tables_for_
sql
Starting the MySQL Client 啟動MySQL客戶端 這是我啟動mysql客戶端的方式
你也許會使用其他方式
如果你使用的是二進制版本或者是Windows系統的電腦
你可能會在其他子目錄下運行以下程序
easy@phpv:~> /usr/local/mysql/bin/mysql
user=root
Welcome to the MySQL monitor
Commands end with ; or \g
Your MySQL connection id is
to server version:
alpha
debug
Type
help;
or
\h
for help
Type
\c
to clear the buffer
在演示中
我將會展示以root身份登陸後的mysql客戶端返回的結果
這樣意味著我有極大的特權
Check for the Correct Version 核對版本 為了確認使用的MySQL的版本是正確的
我們要查詢版本
我有兩種方法確認我使用的是
版本
SHOW VARIABLES LIKE
version
;
or
SELECT VERSION();
例如
mysql> SHOW VARIABLES LIKE
version
;
+
+
+
| Variable_name | Value |
+
+
+
| version |
alpha
debug |
+
+
+
row in set (
sec)
mysql> SELECT VERSION();
+
+
| VERSION() |
+
+
|
alpha
debug |
+
+
row in set (
sec)
當看見數字
x
後就可以確認存儲過程能夠在這個客戶端上正常工作
The Sample Database 示例數據庫 現在要做的第一件事是創建一個新的數據庫然後設定為默認數據庫實現這個步驟的SQL語句如下
CREATE DATABASE db
;
USE db
;
例如
mysql> CREATE DATABASE db
;
Query OK
row affected (
sec)
mysql> USE db
;
Database changed
在這裡要避免使用有重要數據的實際的數據庫然後我們創建一個簡單的工作表
實現這個步驟的SQL語句如下
mysql> CREATE DATABASE db
;
Query OK
row affected (
sec)
mysql> USE db
;
Database changed
mysql> CREATE TABLE t (s
INT);
Query OK
rows affected (
sec)
mysql> INSERT INTO t VALUES (
);
Query OK
row affected (
sec)
你會發現我只在表中插入了一列
這樣做的原因是我要保持表的簡單
因為在這裡並不需要展示查詢數據的技巧
而是教授存儲過程
不需要使用大的數據表
因為它本身已經夠復雜了
這就是示例數據庫
From:http://tw.wingwit.com/Article/program/MySQL/201311/29341.html