MySQL(十一)之觸發器

來源:互聯網
上載者:User

標籤:set   情況   簡單   視圖   字元   結束   table   建表   名稱   

上一篇介紹的是比較簡單的視圖,其實用起來是相對比較簡單的,以後有什麼更多的關於視圖的用法,到時候在自己補充。接下來讓我們一起瞭解一下觸發器的使用!

一、觸發器概述  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 table  for each row ####這句話在MySQL中是固定的  begin  sql語句;  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_orders
  for 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_orders  for each row  begin  update 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 tab1FOR EACH ROWBEGIN     insert 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;

 

MySQL(十一)之觸發器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.