mysql高階 tigger觸發器 2

2021-06-21 11:13:11 字數 3979 閱讀 4517

接上個問題

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 表示將要或者已經刪除的資料 無 因為...