国产探花免费观看_亚洲丰满少妇自慰呻吟_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 ; 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贵德县| 西贡区| 枣阳市| 浦城县| 邵东县| 南木林县| 普宁市| 兴和县| 东丰县| 黔江区| 慈利县| 平邑县| 洛隆县| 涿州市| 兴安县| 准格尔旗| 轮台县| 全椒县| 仁寿县| 綦江县| 通道| 安龙县| 原阳县| 容城县| 长葛市| 福州市| 襄汾县| 双江| 巴林左旗| 襄汾县| 基隆市| 合肥市| 迁西县| 彰武县| 梧州市| 南宫市| 沙河市| 盈江县| 伊宁县| 凤山市| 新营市|