国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql中觸發器的簡單實例

2024-07-24 12:38:49
字體:
來源:轉載
供稿:網友

一個簡單的例子:

1.1. 創建表:create table t(s1 integer);

1.2. 觸發器,代碼如下:

  1. ?delimiter |  
  2. create trigger t_trigger before insert on t  for each row   
  3. begin set @x = "hello trigger";  
  4.        set NEW.s1 = 55;  
  5. end; |

1.3. 如果觸發器創建錯誤,可能只能刪除了,至少我試過不能replace.

drop trigger t_trigger;

1.4. 當執行insert 時:insert into t values(1);

1.5. 會執行觸發器t_trigger:select @x,t.* from t;

1.6. 可以看到結果.

1.7可以使用 SHOW TRIGGERS;查看新建的觸發器

#創建觸發器,當往order表中添加記錄是,更新goods表,代碼如下:

  1. delimiter $ 
  2. CREATE TRIGGER trigger1  
  3. AFTER INSERT ON `order
  4. FOR EACH ROW 
  5. BEGIN 
  6. UPDATE goods SET num=num-new.much WHERE id=new.gid; 
  7. END--Vevb.com 

執行如下代碼:INSERT INTO `order` (gid,much) VALUES(1,5) 后 SELECT * FROM goods WHERE id=1,發現 電視機的數量剩下30,當執行代碼:INSERT INTO `order` (gid,much) VALUES(2,100)后,發現冰箱的數量剩下-77.

這是一個很明顯的漏洞,如何補救呢?

由于update事件是在insert之后發生的,所以我們無法事先對用戶的下單數量(即order表 中的much字段)進行過濾.

解決辦法:在創建觸發器的時候,將after關鍵字改成before,并對用戶的下單數量進行判斷.

首先,得刪除先去的觸發器:drop trigger trigger1;代碼如下:

  1. #創建觸發器 
  2. #觸發時間:before 
  3. delimiter $ 
  4. CREATE TRIGGER trigger1 
  5. BEFORE INSERT ON `order
  6. FOR EACH ROW 
  7. BEGIN 
  8. IF new.much >5 THEN 
  9. SET new.much=5 
  10. END IF; 
  11. UPDATE goods SET num=num-new.much WHERE id=new.gid; 
  12. END

這樣,當執行INSERT INTO `order` (gid,much) VALUES(2,100)的時候,寫入order表的下單數量其實只有5,同樣,goods表中的庫存數量只有減少5,因為在insert操作之前先觸發了

update操作,借此可以對下單數量做個判斷,下面我們來做個題目,現在有張表user(id,name,password),還有一張表user_data(,d_id,d_name,d_tel);我想讓在user表添加一個記錄的時候觸發使user_data也添加一條記錄.比如記錄是 1,張三,114.

這個觸發器在mysql中要怎么寫,記得是mysql不是別的數據庫,代碼如下:

  1. mysql> delimiter // 
  2.     -> create trigger sitedata_ins2 
  3.     -> before insert on user 
  4.     -> for each row 
  5.     -> Begin 
  6.     -> If not exists(select 1 from user_data where d_id=new.id) then 
  7.     -> insert into user_data(d_id,d_name) values(new.id,new.name); 
  8.     -> END IF; 
  9.     -> end;// 
  10.     -> delimiter ; 

或者簡單一點,代碼如下:

  1. mysql> delimiter // 
  2.     -> create trigger sitedata_ins2 
  3.     -> before insert on user 
  4.     -> for each row 
  5.     -> Begin 
  6.     -> insert into user_data(d_id,d_name) values(new.id,new.name); 
  7.     -> end;// 
  8.     -> delimiter ; 

二種方法都可以,建議你用第一種.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长岛县| 永福县| 绥德县| 东方市| 灵武市| 曲靖市| 迭部县| 洪湖市| 都兰县| 隆昌县| 武冈市| 阿巴嘎旗| 柞水县| 吐鲁番市| 昌黎县| 黄大仙区| 汉川市| 镶黄旗| 深水埗区| 罗田县| 普定县| 翁牛特旗| 镇康县| 同仁县| 大连市| 确山县| 天津市| 肥西县| 赤壁市| 铜梁县| 成都市| 洞头县| 句容市| 兰西县| 顺义区| 东平县| 甘孜县| 榆中县| 筠连县| 甘孜县| 菏泽市|