mysql 觸發器的使用

一、觸發器概念

       觸發器(trigger):監視某種情況,並觸發某種操作,它是提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,例如當對一個表進行操作( insert,delete, update)時就會激活它執行。
        觸發器經常用於加強數據的完整性約束和業務規則等。 觸發器創建語法四要素:
        1.監視地點(table)
        2.監視事件(insert/update/delete) 
        3.觸發時間(after/before) 
        4.觸發事件(insert/update/delete)
        觸發器基本語法如下所示:

 

        其中:trigger_time是觸發器的觸發事件,可以爲before(在檢查約束前觸發)或after(在檢查約束後觸發);trigger_event是觸發器的觸發事件,包括insert、update和delete,需注意對同一個表相同觸發時間的相同觸發事件,只能定義一個觸發器;可以使用old和new來引用觸發器中發生變化的記錄內容。
        觸發器SQL語法:

[sql] view plain copy

  1. create trigger triggerName  
  2. after/before insert/update/delete on 表名  
  3. for each row   #這句話在mysql是固定的  
  4. begin  
  5.     sql語句;  
  6. end;  

        推薦大家閱讀:mysql之觸發器trigger - 鄭志偉
        同時使用Navicat for MySQL創建觸發器方法如下圖所示,但是建議使用語句操作。
        首先在Navicat for MySQL找到需要建立觸發器對應的表,右鍵“設計表”,然後創建觸發器。
 



 

二、簡單的Insert觸發器


        假設存在一張學生表(student),包括學生的基本信息,學號(stuid)爲主鍵。
 


 

        另外存在一張成績表(cj),對應每個學生包括一個值。其中number表示序號爲主鍵,自動遞增序列。它在插入過程中默認自增。同時假設成績表中包括學生姓名和學號。
 


        該成績表目前沒有值,先需要設計一個觸發器,當增加新的學生時,需要在成績表中插入對應的學生信息,至於具體math、chinese、english後面由老師打分更新即可。
        那麼,如何設計觸發器呢?
        1.首先它是一個插入Insert觸發器,是建立在表student上的;
        2.然後是after,插入後的事件;
        3.事件內容是插入成績表,主需要插入學生的學號和姓名,number爲自增,而成績目前不需要。
        注意:new表示student中新插入的值。

[sql] view plain copy

  1. create trigger ins_stu  
  2. after insert on student for each row   
  3. begin  
  4.       insert into cj ( stu_id, stu_name)  
  5.         values( new.stuid, new.username);  
  6. end;  

        創建的觸發器如下圖所示:

 

  


        然後插入數據:
        insert student values ('eastmount','111111','6','1991-12-05');
        同時插入兩個數據,觸發器正確執行了~
 




        注意:創建觸發器和表一樣,建議增加判斷:DROP TRIGGER IF EXISTS `ins_stu`;

 

 

三、判斷值後調用觸發器

        這裏簡單講述幾個判斷插入類型的觸發器。
        比如觸發器調用,當插入時間小時爲20時,對數據進行插入:

[sql] view plain copy

  1. DROP TRIGGER IF EXISTS `ins_info`;  
  2. create trigger ins_info  
  3. after insert on nhfxelect for each row   
  4. begin  
  5.     if HOUR(new.RecordTime)='20' then    
  6.     insert into nhfxbyhour (UnitDepName, UnitDepCode, ElectCost, TimeJG, RecordTime)  
  7.         values( '數統學院', '1', new.USERKWH, '20', new.RecordTime);  
  8.     end if;  
  9. end;  

        這個觸發器中,RecordTime爲datetime類型,如"2016-08-28 20:10:00",這時hour()這個值爲20才能插入;否則數據不能插入。同時可以date_format(new.RecordTime, '%Y-%m-%d')判斷日期爲某天或某年某月進行插入。
        同時,再如更新觸發器,如果設置的值爲某個範圍,才進行操作或性別爲"男"或"女"才進行操作。
        基本語法:
        if 判斷條件 then
           sql語句;
        end if;

 

 

 

 

四、Update觸發器-實時更新


        假設存在一個實時插入數據的服務器,例如學生的消費金額或用電量等。
        StuCost:學生的用電數據,實時插入,Cost爲每30秒消費金額,RecordTime爲每分鐘插入時間,datetime類型;
        StuCostbyHour:統計學生一小時的消費金額,HourCost爲金額總數,按小時統計,TimeJD時間段,1~24,對應每小時,RecordTime爲統計時間。
        現在需要設計一個實時更新觸發器,當插入消費數據時,按小時統計學生的消費金額,同理,用電量等。

[sql] view plain copy

  1. DROP TRIGGER IF EXISTS `upd_info`;  
  2. create trigger upd_info  
  3. after insert on StuCost for each row   
  4. begin  
  5.     update StuCostbyHour set HourCost = HourCost + new.Cost  
  6.         where (TimeJD = hour(new.RecordTime) + 1) and date_format(new.RecordTime, '%Y-%m-%d') = date_format(RecordTime, '%Y-%m-%d');  
  7. end;  

        SQL語句中,需要獲取插入的時間,然後通過TimeJD時間段和日期RecordTime找到對應的值,然後進行累加即可。如下圖所示:
 

  

 

文章轉載地址:https://blog.csdn.net/qq_36396104/article/details/80469997

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章