MySQL儲存過程與觸發器的設計與使用
資料庫中的程式邏輯
資料庫程式邏輯與PHP程式邏輯的分體設計原則:
所有的資料庫操作都可以放到PHP程式碼中實現。並且,在 MySQL5.0釋出之前,幾乎所有的PHP與MySQL結合的例項都是這樣做的。 MySQL5.0提供了對觸發器和儲存過程的支援,才使得將程式邏輯放入資料庫中的實現成為可能。
一般說來,以下幾種情況可以將程式邏輯放入資料庫屮來實現
1、觸發的操作。在對資料庫的資訊進行更新時,某一操作將被反覆呼叫。例如,只要對某個資料庫表中的資料進行刪除,就將被刪除的資料存放到另一個表中。
2、原子化操作。例如,在系統中要經常以某個表中的資料為依據對使用者的輸入進行驗證。
3、反覆呼叫的操作
資料庫程式邏輯與資料的關係
資料庫中的程式邏輯與資料的關係和PHP與資料庫的關係相類似,兩者都是用於存取資料的,資料庫中的程式邏輯本身不包含任何資料。
資料庫中用於實現程式邏輯的物件通常包括儲存過程和觸發器兩種。
儲存過程主要供PHP程式呼叫,並實現儲存資料的功能;
觸發器是當資料發生變化滿足觸發要求時被呼叫的,並實現存取資料的功能。
一、儲存過程的設計:
1、定界符重定義:
預設情況下,美碰到一次分號就會將語句提交併執行。在儲存過程或者觸發器的設計中,通常會有多條sql語句,會遇到很多分號,於是我們需要在執行前使用我們自己定義的定界符。
方法:mysql > delimiter
2、儲存過程建立與使用:(通過命令列的方式)
函式:
create produce name**(引數)
body(程式碼部分);
引數:
1)、in:表示該引數是一個傳入的引數
2)、out:表示該引數是一個傳出的引數
3)、inout:表示該引數是一個既是傳入也是傳出的引數
3、複合語句:
在儲存過程中可能不止一條SQL語句,需要用到begin…end來表示語句的開始和結束。
begin
....
end
4、變數
在儲存過程中宣告變數:declare name type default value;其中name表示變數名,type表示變數型別,如int,string
5、條件語句
1)if-then-else-end if:
if 判斷條件 then
程式碼;
else
程式碼;
end if;
2)case:
case 變數
when 值1 then 執行程式碼;
when 值2 then 執行程式碼;
else 執行程式碼;
end case;
在儲存過程中沒有break語句,即程式配到到相應的value後執行相關語句後就會退出,不會再依次進行後面的語句。
6、迴圈
1)while:
whie 條件 do
語句;
end while;//***直到條件不成立後退出迴圈;
2)repate:
repate
執行語句;
unti 條件
end while;
3)loop
loop_table:loop
程式碼語句;
if 條件 then //條件滿足就跳到loop標籤指定位置。
leave loop_label;
end if;
end loop;
7、遊標的使用:
使用遊標是為了對資料表中的每一條資料進行操作,遊標是一個可以用於迴圈讀取資料表中的物件,每次讀取資料表中1的一行。
1)定義遊標:
declare curl(遊標名) cursor for sql_statement(遊標使用的SQL語句)
2)開啟遊標:
open cursor_name;
3)獲取遊標類容:
fetch cursor_name into 變數1,變數2........
//將讀取到的資料儲存到into後指定的變數中,並移動到下一行。
4)關閉遊標:
close cursor_name;
8)刪除儲存過程:
drop procedure pro_name;
二、觸發器的設計:
1、觸發器的建立與觸發:
create trigger name(觸發器名字)
before|after//觸發器觸發時間。
insert|update|delete//操作,即在在操作之前發生還是操作之後發生
on table(表名)//在哪一個表進行操作
for each row
body//程式碼語句,在觸發器體內有兩個預設的行new,old。即一個是操作前的,一個是操作後的。
2、觸發器的刪除:
drop trigger_name;
個人小結:在PHP中呼叫儲存過程和執行SQL語句進行資料庫查詢是相同的,而對於觸發器,使用PHP進行資料庫操作的行為同樣會自動觸發觸發器的行為。總而言之,儲存過程與觸發器的使用即是為了提高資料庫執行的效率和資料的安全性。