一、觸發器概念
觸發器(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
- create trigger triggerName
- after/before insert/update/delete on 表名
- for each row #這句話在mysql是固定的
- begin
- sql語句;
- 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
- create trigger ins_stu
- after insert on student for each row
- begin
- insert into cj ( stu_id, stu_name)
- values( new.stuid, new.username);
- end;
創建的觸發器如下圖所示:
然後插入數據:
insert student values ('eastmount','111111','6','1991-12-05');
同時插入兩個數據,觸發器正確執行了~
注意:創建觸發器和表一樣,建議增加判斷:DROP TRIGGER IF EXISTS `ins_stu`;
三、判斷值後調用觸發器
這裏簡單講述幾個判斷插入類型的觸發器。
比如觸發器調用,當插入時間小時爲20時,對數據進行插入:
[sql] view plain copy
- DROP TRIGGER IF EXISTS `ins_info`;
- create trigger ins_info
- after insert on nhfxelect for each row
- begin
- if HOUR(new.RecordTime)='20' then
- insert into nhfxbyhour (UnitDepName, UnitDepCode, ElectCost, TimeJG, RecordTime)
- values( '數統學院', '1', new.USERKWH, '20', new.RecordTime);
- end if;
- 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
- DROP TRIGGER IF EXISTS `upd_info`;
- create trigger upd_info
- after insert on StuCost for each row
- begin
- update StuCostbyHour set HourCost = HourCost + new.Cost
- where (TimeJD = hour(new.RecordTime) + 1) and date_format(new.RecordTime, '%Y-%m-%d') = date_format(RecordTime, '%Y-%m-%d');
- end;
SQL語句中,需要獲取插入的時間,然後通過TimeJD時間段和日期RecordTime找到對應的值,然後進行累加即可。如下圖所示:
文章轉載地址:https://blog.csdn.net/qq_36396104/article/details/80469997