mysql初學之觸發器和儲存過程
觸發器是資料庫系統中的一種機制,可以根據某一張表的增、刪、改操作時作出一些特定的功能處理。
觸發器建立在表的基礎上,型別有三種,增、刪、改,也就是說,一個表最多隻能建立三個觸發器。
同時,觸發器是可以聯動的。比如說銷售記錄插入一條銷售資訊,則銷售記錄表的insert觸發器觸發,針對商品表的庫存進行修改。如果商品表建立了update觸發器,則商品表的update觸發器也會緊跟著觸發。
語法 :create trigger t_xiaoshou after insert/update/delete on 表名
for each row
begin
//業務處理
//業務處理
end;
在觸發中new表示新新增的資料行 old 表示刪除的資料行。
Insert 時只有new 資料行
Delete時只有 old 資料行
Update時 兩個資料行都有,更改資料時,先把這一行資料刪除,資料行存在old裡面,然後再插入修改後的資料行,則插入的資料行儲存在new 裡面。
案例:
使用update 觸發器實現QQ的線上時長更改,則重新計算QQ等級
DELIMITER$$
CREATE TRIGGER t_qqtime BEFORE UPDATE ON TIME/*自表更新用Before*/
FOR EACH ROW
BEGIN
/*判斷今天登入時長有沒有大於120分鐘*/
IF old.time!=new.time AND new.time>=old.time+120 THEN
/*大於120分鐘則加一天*/
SET new.day=old.day+1;
END IF;
/*10級以下的判斷條件*/
IF old.grade<10 THEN
/*10級以下,每5天升一級*/
IF old.day!=new.day AND new.day%5=0 THEN
SET new.grade=old.grade+1;
END IF;
END IF;
IF old.grade<20 THEN
/*10-20級,每8天升一級*/
IF old.day!=new.day AND new.day%8=0 THEN
SET new.grade=old.grade+1;
END IF;
END IF;
END$$;
儲存過程類似於Java中的方法,把一些複雜的業務進行封裝,並進行了預編譯,以後可以呼叫過程名,就可以執行過程中的業務程式碼,就像Java中的方法呼叫。過程可以給引數。
優點:速度快、安全、減少網路流量
案例1:無參儲存過程的演示
1. 建立無參的儲存過程,查詢各年級的科目資訊
DELIMITER$$
CREATE PROCEDURE p_student4()/*建立儲存過程*/
BEGIN
/*執行多條語句*/
SELECT *FROM SUBJECT JOIN grade ON subject.`gradeID`=grade.`id`;
END
$$;
/*呼叫無參儲存過程*/
CALL p_student4();
案例2:有參的儲存過程演示
1. 用輸入和輸出引數實現指定年級的課程數量。
DELIMITER$$/*建立有參儲存函式,in是傳入引數,out是傳出引數*/
CREATE PROCEDURE p_total(IN grade VARCHAR(20),OUT num1 INT,OUT num2 INT)
BEGIN/*執行多條查詢命令*/
/*查詢出輸入的grade的id 通過獲取到的年級id查詢出課程數並賦值給num1*/
SELECT COUNT(*) INTO num1 FROM SUBJECT WHERE gradeid IN
(SELECT id FROM grade WHERE gradename=grade);
/*查詢出輸入的grade的id 通過獲取到的年級id查詢出課程總時間並賦值給num2*/
SELECT SUM(classhour) INTO num2 FROM SUBJECT WHERE gradeid IN
(SELECT id FROM grade WHERE gradename=grade);
/*查詢出該年級的課程詳細資訊*/
SELECT * FROM SUBJECT WHERE gradeid IN
(SELECT id FROM grade WHERE gradename=grade);
END
$$;
/*設定接收變數 必須要有@*/
SET @n1=0;SET @n2=0;
/*傳入相應的引數*/
CALL `p_total`('一年級',@n1,@n2);
/*查詢出結果,通過下圖可以看出一年級有2門課,總課時168*/
SELECT @n1'課程數',@n2'課程總時間';