接上個問題
number 和 gid 都傳什麼?
insert語句是否可以被引用到?
insert 和 delete 兩個狀態
delimiter $
create trigger t2
after
insert
on ordz
for each row
begin
update goods set number = number-? where gid = ?; # 哪乙個? 因為是新的所以欄位為 new
end $
改為
delimiter $
create trigger t2
after
insert
on ordz
for each row
begin
update goods set number = number-new.much where gid = new.gid; # new
end $
ok,報錯了
大致意思是 不能同時監視兩個一樣的 如 insert 這種操作!!
檢視已經有的: show triggers [\g]
刪掉已經有的 : drop trigger name;
再次執行就可~~~
truncate ordz; # 不干擾視線
insert into ordz values(3,2,2)$
insert into ordz values(4,3,9)$
+-----+------+--------+
| gid | name | number |
+-----+------+--------+
| 1 | cat | 14 |
| 2 | dog | 18 |
| 3 | pig | 11 |
+-----+------+--------+ # 成功 合理的刪除了 改刪除的
如果取消訂單?應該恢復!
比如第三個pig商品
create trigger t3
after
delete
on ordz
for each row
begin
update goods set number = old.much+number where gid= old.gid;
end$
delete from ordz where oid = 4 $ # 刪除訂單
+-----+------+--------+
| gid | name | number |
+-----+------+--------+
| 1 | cat | 14 |
| 2 | dog | 18 |
| 3 | pig | 20 |
+-----+------+--------+
改數量:
'' insert 'new'
'old' delete ''
'old' update 'new'
三種狀態
比如改pig
mysql> select * from goods;
+-----+------+--------+
| gid | name | number |
+-----+------+--------+
| 1 | cat | 14 |
| 2 | dog | 18 |
| 3 | pig | 11 |
+-----+------+--------+
3 rows in set (0.00 sec)
mysql> select * from ordz;$
+-----+------+------+
| oid | gid | much |
+-----+------+------+
| 1 | 1 | 2 |
| 3 | 2 | 2 |
| 4 | 3 | 9 |
+-----+------+------+
create trigger t4
before
update
on ordz
for each row
begin
update goods set number = number + old.much - new.much where gid = old.gid;
# +(5-3) = 2
end$
update ordz set much = 5 where oid=4$
mysql> select * from goods$
+-----+------+--------+
| gid | name | number |
+-----+------+--------+
| 1 | cat | 14 |
| 2 | dog | 18 |
| 3 | pig | 15 |
+-----+------+--------+
3 rows in set (0.00 sec)
mysql> select * from ordz$
+-----+------+------+
| oid | gid | much |
+-----+------+------+
| 1 | 1 | 2 |
| 3 | 2 | 2 |
| 4 | 3 | 5 |
+-----+------+------+
3 rows in set (0.00 sec)
before 好像沒有區別?!!~~
如果剩餘3頭豬,但是客戶買了10頭豬,發生了什麼情況!! 能否預防?
例:
> update ordz set much = 30 where oid=4
ordz:
+-----+------+------+
| oid | gid | much |
+-----+------+------+
| 1 | 1 | 2 |
| 3 | 2 | 2 |
| 4 | 3 | 30 |
+-----+------+------+
goods:
+-----+------+--------+
| gid | name | number |
+-----+------+--------+
| 1 | cat | 14 |
| 2 | dog | 18 |
| 3 | pig | -10 |
+-----+------+--------+ # 能否在購買量超過庫存時,把much自動改為number 。 before 就體現出來了
爆倉了!!! MySQL高階 觸發器
觸發器是與表有關的資料庫物件,指在insert update delete 之前或之後,觸發並執行觸發器中定義的sql語句集合。類似js中的事件 觸發器的這種特性可以協助應用在資料庫端確保資料的完整性 日誌記錄 資料校驗等操作。使用別名 old 和 new 來引用觸發器中發生變化的記錄內容,這與其他...
MySQL高階之觸發器
觸發器是與表有關的資料庫物件,指在 insert update delete 之前或之後,觸發並執行觸發器中定義的sql語句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性 日誌記錄 資料校驗等操作 使用別名 old 和 new 來引用觸發器中發生變化的記錄內容,這與其他的資料庫是相似的...
MySQL高階 02 MySQL觸發器
1.觸發器的概念 觸發器型別 old的含義 new的含義 insert 型觸發器 無 因為插入前狀態無資料 new 表示將要或者已經新增的資料 update 型觸發器 old 表示修改之前的資料 new 表示將要或已經修改後的資料 delete 型觸發器 old 表示將要或者已經刪除的資料 無 因為...