MySQL(十一)之触发器
上一篇介紹的是比較簡單的視圖,其實用起來是相對比較簡單的,以后有什么更多的關于視圖的用法,到時候在自己補充。接下來讓我們一起了解一下觸發器的使用!
一、觸發器概述
1.1、什么是觸發器
觸發器(Trigger):監視某種情況,并觸發某種操作。在MySQL Server里面也就是對某一個表的一定的操作,觸發某種條件(Insert,Update,Delete 等),從而自動執行的一段程序。
注意:你必須擁有相當大的權限才能創建觸發器(CREATE TRIGGER),如果你已經是Root用戶,那么就足夠了。這跟SQL的標準有所不同。
1.2、觸發器作用
那么為什么要使用數據庫對象觸發器呢?在具體開發項目時,經常會遇到如下實例:
1)在學生表中擁有字段學生姓名,字段學生總數,每當添加一條學生信息時,學生的總數就必須同時更改。
2)在學生表中還會有學生姓名的縮寫,學生住址等字段,添加學生信息時,往往需要檢查電話、郵箱等格式是否正確。
上面的例子使用觸發器完成時具有這樣的特點,需要在表發生改變時,自動進行一些處理。MySQL在觸發DELETE/UPDATE/INSERT語句時就會自動執行所設置的操作,其他SQL語句則不會激活觸發器。
1.3、觸發器四要素
監視地點:table
監聽事件:insert/update/delete
觸發時間:after/before
觸發事件:insert/update/delete
二、觸發器用法
2.1、觸發器語法
CREATE TRIGGER <觸發器名稱>? --觸發器必須有名字,最多64個字符,可能后面會附有分隔符.它和MySQL中其他對象的命名方式基本相象.
{ BEFORE | AFTER }? --觸發器有執行的時間設置:可以設置為事件發生前或后。
{ INSERT | UPDATE | DELETE }? --同樣也能設定觸發的事件:它們可以在執行insert、update或delete的過程中觸發。
ON <表名稱>? --觸發器是屬于某一個表的:當在這個表上執行插入、 更新或刪除操作的時候就導致觸發器的激活. 我們不能給同一張表的同一個事件安排兩個觸發器。
FOR EACH ROW? --觸發器的執行間隔:FOR EACH ROW子句通知觸發器 每隔一行執行一次動作,而不是對整個表執行一次。
<觸發器SQL語句>? --觸發器包含所要觸發的SQL語句:這里的語句可以是任何合法的語句, 包括復合語句,但是這里的語句受的限制和函數的一樣。
簡單的寫就是這樣:
create trigger tg_name after/before insert/update/delete on tablefor each row ####這句話在MySQL中是固定的beginsql語句;end$?
分析:由于在以上代碼段中的“sql語句;”是以分號結尾,所以需要將MySQL中的結尾標志換成“$”,更換MySQL命令結束標志的命令:delimiter $;
? 以上觸發器語法中的各個段的顏色與四要素對應查看理解。
2.2、創建觸發器
1)創建兩張表
create table tb_goods(id int primary key auto_increment,name varchar(20),num int);create table tb_orders(id int primary key auto_increment,good_id int,much int);?
2)在商品表中插入數據
insert into tb_goods(name,num)values('商品1',10),('商品2',10),('商品3',10);?
3)假如我們賣了3個商品1
沒有觸發器:
往訂單表中插入一條記錄:insert into tb_orders(good_id,much) values(1,3);
更新商品表中商品1的剩余數量:update tb_goods set num=num-3 where id=1;
創建觸發器:
create trigger tg_1 after insert on tb_ordersfor each row
begin
update tb_goods set num=num-3;
end$
?
這個時候如果執行insert into tb_orders(good_id,much) values(1,3);會發現商品的數量變為7了,說明在插入一條訂單的時候,觸發器自動做了更新操作。
2.3、觸發器對值得引用
上述觸發器有一個問題,因為在觸發器中寫死了num和id,所以不管買哪個商品,最終更新的都是商品1的數量。這個時候,需要將觸發器中的值變為動態獲取。
對于insert來說,新插入的行用new來表示,行中的每一列的值用“new.列名”來表示:
新建能動態獲取值的觸發器:
create trigger tg_2 after insert on tb_ordersfor each rowbeginupdate tb_goods set num=num-new.much where id=new.id;end$?
刪除第一個觸發器:drop trigger tg_1;
插入一條訂單記錄:insert into tb_orders(good_id,much) values(2,3)$
執行完發現商品的數量變為7了,這樣子就是合適的。
三、觸發器實例
1)創建表tab1
DROP TABLE IF EXISTS tab1;CREATE TABLE tab1(tab1_id varchar(11));2)創建表tab2
DROP TABLE IF EXISTS tab2;CREATE TABLE tab2(tab2_id varchar(11));3)創建觸發器:t_afterinsert_on_tab1
DROP TRIGGER IF EXISTS t_afterinsert_on_tab1; CREATE TRIGGER t_afterinsert_on_tab1 AFTER INSERT ON tab1 FOR EACH ROW BEGINinsert into tab2(tab2_id) values(new.tab1_id); END;4)想tab1插入數據
INSERT INTO tab1(tab1_id) values('0001');5)查看變化
SELECT * FROM tab1; SELECT * FROM tab2;?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的MySQL(十一)之触发器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python-ConfigParser模
- 下一篇: 新加坡樟宜机场将进入“刷脸”时代 自助通