MySQL學習隨記 觸發器

2021-08-04 20:44:52 字數 3003 閱讀 7892

(1) 觸發器是乙個特殊的儲存過程, 他是mysql在insert, update, delete 的時候自動執行的**塊

(2) 觸發器必須定義在特定的表上

(3)自動執行, 不能直接呼叫

作用: 監視某種情況並觸發某種操作

觸發器的思路:

監視 it_order 表, 如果 it_order 裡面有增刪改查的操作, 則自動觸發 it_goods 裡面增刪改的操作

比如新增乙個訂單, 則it_goods表, 就自動減少對應商品的庫存

比如取消乙個訂單, 則it_goods表, 就自動增加對應商品的減少的庫存

table

insert/update/delete

after/before

insert/update/delete

建立觸發器語法:

create trigger trigger_name

after/before insert/update/delete on 表名

for each row

begin

sql 語句:(觸發的語句一句或多句)

end語法: drop trigger 觸發器名字

語法: show triggers

案例1: 第乙個觸發器, 購買乙個包子, 減少乙個庫存

分析:

監視的地點: orders表

監視的事件: orders表的insert操作

觸發的事件: goods表減少庫存的操作

create trigger t1

after insert on orders

for each row

begin

update goods set goods_number=goods_number-1 where id=1;

end;

這個觸發器存在問題, 永遠減少id=1 商品的庫存

案例2: 購買商品, 減少對應庫存

注意: 如果在觸發器中引用行的值:

對於insert而言, 新增的行用new來表示; 行中的每一列的值, 用 new.列名來表示

create trigger t1

after insert on orders

for each row

begin

update goods set goods_number=goods_number-new.much where id=new.goods_id;

end;

案例3: 取消訂單是, 減少的庫存要新增回來

監視的地點: orders表

監視的事件: orders表的delete操作

觸發的事件: goods表恢復庫存的操作

對於delete而言, 刪除的行我們使用old來表示, 如果要引用裡面的資料, 則使用old.列名來表示

create trigger t1

after delete on orders

for each row

begin

update goods set goods_number=goods_number+old.much where id=old.goods_id;

end;

案例4: 修改訂單時, 庫存也要做對應的修改(修改購買數量和購買型別)

監視的地點: orders表

監視的事件: orders表的update操作

觸發的事件: goods表修改對應庫存的操作

完成修改的思路:1. 撤銷訂單, goods表中的庫存要恢復

2.重新下訂單, goods表中的庫存要減少

對於update而言, 修改前的資料用old來表示, old.列名引用被修改之前行中的值, 

修改後的資料用new來表示, new.列名引用被修改之後行中的值

create trigger t2

after update on orders

for each row

begin

update goods set goods_number=goods_number+old.much where id=old.goods_id;

update goods set goods_number=goods_number-new.much where id=new.goods_id;

end;

after是先完成資料的增刪改, 再觸發, 觸發其中的語句晚於監視的增刪改, 無法影響前面的增刪改動作, 就類似於先吃飯, 再付錢

before是先完成觸發, 再增刪改, 觸發的語句優先於監視的增刪改發生, 我們有機會判斷修改即將發生的操作, 就類似於先付錢, 再吃飯

典型案例: 對於已下的訂單, 進行判斷, 如果訂單的數量》5, 就認為是惡意訂單, 強制把所定的商品數量改為5

分析:

監視的地點: orders表

監視的事件: orders表的insert操作

觸發的事件: 如果訂單的數量》5, 強制把所定的商品數量改為5

create trigger t3

before insert on orders

for each row

begin

if new.much>5 then

set new.much=5;

end if;

end;

目前mysql不支援 多個具有同一動作, 同一時間, 同一事件, 同一地點的觸發器 

觸發器 mysql觸發器

觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...

Mysql學習 觸發器

觸發器是一類特殊的事務,可以監視某種資料操作 insert delete update 並觸發相應操作 insert delete update 使用場景 1 當向一張表中新增或刪除記錄時,需要在相關表中進行同步操作 2 當表上某列資料的值與其他表中的資料有聯絡時。3 當需要對某張表進行跟蹤時 二 ...

mysql 觸發器學習

mysql 觸發器學習 1.乙個簡單的例子 1.1.建立表 create table t s1 integer 1.2.觸發器 delimiter create trigger t trigger before insert on t for each row begin set x hello t...