這里是MYSQL成圣之路
了解觸發器和事件(定時器)
什么是觸發器?
概念: 觸發器(trigger)是SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用于加強數據的完整性約束和業務規則等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。SQL3的觸發器是一個能由系統自動執行對數據庫修改的語句。
通俗的來講,觸發器就是一個觸發裝置,裝置里面存有一段操作。這個裝置有觸發條件,達到某個條件就會觸發這個裝置,觸發裝置就會執行存儲的一段操作。
什么是事件(定時器)?
概念: 事件(event)是MySQL在相應的時刻調用的過程式數據庫對象。一個事件可調用一次,也可周期性的啟動,它由一個特定的線程來管理的,也就是所謂的“事件調度器”。
通俗的來講,事件就可以看作一個定時器,設定一個時間。等時間到了開始執行設置好的操作。
觸發器和事件(定時器)的區別
- 事件和觸發器類似,都是在某些事情發生的時候啟動。當數據庫上啟動一條語句的時候,觸發器就啟動了,而事件是根據調度事件來啟動的。由于他們彼此相似,所以事件也稱為臨時性觸發器。
- 事件取代了原先只能由操作系統的計劃任務來執行的工作,而且MySQL的事件調度器可以精確到每秒鐘執行一個任務,而操作系統的計劃任務(如:Linux下的CRON或Windows下的任務計劃)只能精確到每分鐘執行一次。
創建觸發器和事件(定時器)
創建觸發器
例一:建立一個用戶表(用戶ID,用戶姓名),建立一個觸發器(當用戶表中插入數據時,自動生成一個全局唯一的ID)
先建立user表
create table user( id int PRIMARY KEY, name varchar(20) );
建立觸發器
-- 建立觸發器名為tt create TRIGGER tt -- 觸發條件,向user表中插入數據時啟動觸發器 BEFORE insert on user -- 檢查表中每一行,對新插入的數據進行操作 for EACH ROW -- 執行操作 BEGIN set new.id=UUID(); END
剛剛建立的觸發器(查看當前數據庫下全部觸發器的代碼show triggers)
效果:向表中插入三個用戶名,自動生成三個ID
insert user(name) VALUE('張三'),('李四'),('王五')
例二:再建立一個訂單表DD(訂單ID,商品名稱,用戶ID),建立一個觸發器tq1(當刪除一個用戶時,該用戶的訂單也將刪除)
建表
create table DD( ddid int PRIMARY KEY, ddname VARCHAR(20), userid VARCHAR(50) )
建立觸發器
delimiter $ -- 建立觸發器名為tq create TRIGGER tq1 -- 觸發條件,再dd表刪除數據之后啟動觸發器 AFTER DELETE on user -- 檢查表中每一行,對新插入的數據進行操作 for EACH ROW -- 執行操作 BEGIN DELETE FROM dd WHERE old.id=userid; END $ delimiter ;
向表中添加兩條數據
效果:刪除user表中的用戶,dd表中的記錄也跟隨刪除 刪除張三
delete from user WHERE name='張三'
創建事件(定時器)
在User表中設置一個事件在一分鐘后執行。一分鐘后向user表中添加三條數據
-- 創建事件e1 create event e1 -- 預定時間 on SCHEDULE -- 當前時間加一分鐘 AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE -- 執行操作 do insert user(name) VALUE('王大麻子'),('王二麻子'),('王三麻子');
效果 執行前
沒到一分鐘查看一下,沒有變化
一分鐘后,數據自動添加上了
對觸發器和時間(定時器)的操作
查看當前數據庫下的觸發器和定時器
這里只能查看還未執行的定時器,執行完的已經沒了
// 查詢當前庫下的定時器 show events
查看當前庫下的觸發器
show TRIGGERS
刪除定時器和觸發器
刪除觸發器tt2
DROP TRIGGER tt2
新建定時器
刪除定時器
drop event e1
-- 開啟關閉事件調度器 -- ON 1 開啟事件功能 -- OFF off 0 關閉事件功能 set global event_scheduler = OFF set global event_scheduler = on;
到此這篇關于MySQL事件與觸發器專題精煉的文章就介紹到這了,更多相關MySQL 觸發器內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_50843918/article/details/123145239