1. 程式人生 > >mysql初學之觸發器和儲存過程

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'課程總時間';