Mysql觸發器,mysql觸發器執行個體
建立觸發器
delimiter $ 把mysql結束符號 變成$
CREATE TRIGGER <觸發器名稱> <-----觸發器名字{ BEFORE | AFTER } <-----觸發時間觸發時間:觸發器有執行的時間設定:可以設定為事件發生前或後{ INSERT | UPDATE | DELETE }ON <表名稱> <-----表名稱觸發器是屬於某一個表的:當在這個表上執行插入、更新或刪除操作的時候就導致觸發器的啟用,我們不能給同一張表的同一個事件安排兩個觸發器。FOR EACH ROWFOR EACH ROW子句通知觸發器每隔一行執行一次動作,而不是對整個表執行一次。<觸發器SQL語句>觸發器包含所要觸發的SQL語句:這裡的語句可以是任何合法的語句,包括複合陳述式,但是這裡的語句受的限制和函數的一樣。
建立帶有觸發器的表
CREATE TABLE t22 (s1 INTEGER)//CREATE TRIGGER t22_biBEFORE INSERT ON t22FOR EACH ROWBEGINSET NEW.s1 = 55;END;
建立了一個名字為t22的表,然後在表t22上建立了一個觸發器t22_bi,當我們要向表中的行插入時,觸發器就會被啟用,執行將s1列的值改為55的動作
查看已有觸發器
show triggers;
刪除觸發器
drop trigger <觸發器名稱>
old和new
在觸發器的SQL語句中,你可以關聯表中的任意列。但你不能僅使用列的名稱去標識,那會使系統混淆,因為那裡可能會有列的新名(這可能正是你要修改的,你的動作可能正是要修改列名),還有列的舊名存在。因此你必須用這樣的文法來標識:
“NEW . 列名”或者”OLD . 列名”.這樣在技術上處理(NEW | OLD )新和舊的列名, 屬於建立了過渡變數
insert 原本沒有這一行資料但是你插入了這一條資料所以就是新
delete 原本這一行是有 但是刪了之後這一行是沒有的 所以就是舊
update 曾經的資料是舊 改之後的資料是新
小問題
庫虧量僅有3個 但客戶買了10個 避免庫存量變成負數
create trigger t1BEFORE 在觸發之前inserton ordfor each rowbegin#在觸發器中聲明一個變數declarernum int;#把庫存量num賦值給rnumselect num into rnum from goods where gid=new.gid;#much 你要買的數量if new.much>rnum如果購買的數量大於庫虧量的情況下就把當前庫存量賦值給要購買的數量 set new.much=rnum;end if;然後在修改 goods表 庫存量減去當前的購買量update goods set num=num-new.much where gid=new.gid;end$
著作權聲明:一步一個腳印,方便自己複習,該出手時就出手,有錯誤,一定要指正,非常感謝,共同進步!