MySQL觸發(fā)器學習總結
更新時間:2012年09月04日 22:39:22 作者:
創(chuàng)建觸發(fā)器,當往order表中添加記錄是,更新goods表,大家可以看下語句即可
復制代碼 代碼如下:
#創(chuàng)建觸發(fā)器,當往order表中添加記錄是,更新goods表
delimiter $
CREATE TRIGGER trigger1
AFTER INSERT ON `order`
FOR EACH ROW
BEGIN
UPDATE goods SET num=num-new.much WHERE id=new.gid;
END$
執(zhí)行
INSERT INTO `order` (gid,much) VALUES(1,5)
后
SELECT * FROM goods WHERE id=1
發(fā)現(xiàn) 電視機的數(shù)量剩下30
當執(zhí)行
INSERT INTO `order` (gid,much) VALUES(2,100)
后
發(fā)現(xiàn)
冰箱的數(shù)量剩下-77
這是一個很明顯的漏洞,如何補救呢?
由于update事件是在insert之后發(fā)生的,所以我們無法事先對用戶的下單數(shù)量(即order表
中的much字段)進行過濾
解決辦法:
在創(chuàng)建觸發(fā)器的時候,將after關鍵字改成before,并對用戶的下單數(shù)量進行判斷
首先,得刪除先去的觸發(fā)器
drop trigger trigger1;
復制代碼 代碼如下:
#創(chuàng)建觸發(fā)器
#觸發(fā)時間:before
delimiter $
CREATE TRIGGER trigger1
BEFORE INSERT ON `order`
FOR EACH ROW
BEGIN
IF new.much >5 THEN
SET new.much=5
END IF;
UPDATE goods SET num=num-new.much WHERE id=new.gid;
END$
這樣,當執(zhí)行INSERT INTO `order` (gid,much) VALUES(2,100)的時候,寫入order表的下單數(shù)量其實只有5,同樣,goods表中的庫存數(shù)量只有減少5,因為在insert操作之前先觸發(fā)了
update操作,借此可以對下單數(shù)量做個判斷
相關文章
MySQL使用IF函數(shù)動態(tài)執(zhí)行where條件的方法
這篇文章主要介紹了MySQL使用IF函數(shù)來動態(tài)執(zhí)行where條件,詳細介紹了IF函數(shù)在WHERE條件中的使用,MySQL的IF()函數(shù),接受三個表達式,如果第一個表達式為true,而不是零且不為NULL,它將返回第二個表達式,需要的朋友可以參考下2022-09-09解決遠程連接MySQL報錯:2003 - Can‘t connect to&nb
這篇文章主要給大家介紹了解決遠程連接MySQL報錯:2003 - Can‘t connect to MySQL server on ‘X.X.X.X‘ (10060 “Unknown error“)問題的方案,文中有詳細的解決步驟,需要的朋友可以參考下2023-09-09mysql利用參數(shù)sql_safe_updates限制update/delete范圍詳解
這篇文章主要給大家介紹了關于mysql如何利用參數(shù)sql_safe_updates限制update/delete范圍的相關資料文中介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-10-10Mysql 乘法除法精度不一致問題(除法后四位小數(shù))
這篇文章主要介紹了Mysql 乘法除法精度不一致,除法后四位小數(shù),本文通過問題分析實例代碼講解,給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03詳解在Windows環(huán)境下訪問linux虛擬機中MySQL數(shù)據(jù)庫
這篇文章主要介紹了如何Windows環(huán)境下訪問linux虛擬機中MySQL數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04