日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL(十一)之触发器

發布時間:2024/4/13 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_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_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(十一)之触发器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。