delimiter $ 把mysql結束符號 變成$
CREATE TRIGGER <觸發器名稱> <-----觸發器名字
{ BEFORE | AFTER } <-----觸發時間
觸發時間:觸發器有執行的時間設置:可以設置為事件發生前或後
{ INSERT | UPDATE | DELETE }
ON <表名稱> <-----表名稱
觸發器是屬於某一個表的:當在這個表上執行插入、更新或刪除操作的時候就導致觸發器的激活,我們不能給同一張表的同一個事件安排兩個觸發器。
FOR EACH ROW
FOR EACH ROW子句通知觸發器每隔一行執行一次動作,而不是對整個表執行一次。
<觸發器SQL語句>
觸發器包含所要觸發的SQL語句:這裡的語句可以是任何合法的語句,包括復合語句,但是這裡的語句受的限制和函數的一樣。
創建帶有觸發器的表
CREATE TABLE t22 (s1 INTEGER)//
CREATE TRIGGER t22_bi
BEFORE INSERT ON t22
FOR EACH ROW
BEGIN
SET 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 t1
BEFORE 在觸發之前
insert
on ord
for each row
begin
#在觸發器中聲明一個變量
declare
rnum int;
#把庫存量num賦值給rnum
select 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$