(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...