create trigger trigger_order AFTER INSERT ON orders FOR EACH ROW BEGIN UPDATE product SET pnum=pnum-NEW.onum where pid = NEW.pid; END 插入兩個(gè)訂單
INSERT INTO orders(pid, onum)VALUES(1, 10); INSERT INTO orders(pid, onum)VALUES(2, 5); 查看產(chǎn)品表,可以看到對(duì)應(yīng)的產(chǎn)品數(shù)量減少。操作由訂單表的Insert觸發(fā)器完成。 MySQL數(shù)據(jù)庫(kù)高級(jí)(五)——觸發(fā)器 在訂單表上創(chuàng)建新的觸發(fā)器,當(dāng)訂單定的某產(chǎn)品產(chǎn)品數(shù)量大于產(chǎn)品庫(kù)存,禁止下訂單,也就是禁止在訂單表中插入記錄。 一張表中只能有一個(gè)INSERT類型的觸發(fā)器,先刪除INSERT觸發(fā)器。 drop trigger trigger_order; MySQL不能在觸發(fā)器中通過(guò)回滾事務(wù)取消操作,但如果觸發(fā)器的SQL語(yǔ)句執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤,會(huì)自動(dòng)撤銷操作,曲線實(shí)現(xiàn)事務(wù)回滾。
create trigger trigger_order BEFORE INSERT ON orders FOR EACH ROW BEGIN DECLARE var int; DECLARE mesg varchar(20); SELECT pnum INTO var FROM product where pid=NEW.pid; IF var<NEW.onum THEN SELECT XXXX INTO mesg; ELSE UPDATE product SET pnum=pnum-NEW.onum where pid=NEW.pid; END IF; END 插入訂單,看看如果庫(kù)存不夠是否還能夠插入成功。 INSERT INTO orders(pid, onum)VALUES(1, 110);
create trigger trigger_limitDate BEFORE INSERT ON orders FOR EACH ROW BEGIN DECLARE mesg varchar(10); IF DAYNAME(now())='sunday' or DAYNAME(now())='saturday' THEN SELECT XXXXX INTO mesg; ELSE SET mesg='允許插入訂單'; END IF; END 驗(yàn)證上面創(chuàng)建的觸發(fā)器是否工作正常,看看當(dāng)前時(shí)間是否是周六周日,向訂單表插入記錄,檢查是否能夠成功。 insert into orders(pid,onum) values (3,30) B、限制數(shù)據(jù)更改的范圍 在產(chǎn)品表上創(chuàng)建更新觸發(fā)器,限制產(chǎn)品價(jià)格一次上調(diào)不能超過(guò)20%。 觸發(fā)器設(shè)置成before update,在更改前檢查價(jià)格增長(zhǎng)幅度是否超過(guò)20%,如果超過(guò)就產(chǎn)生錯(cuò)誤,取消操作。 更新操作分為兩步,第一步是刪除原來(lái)的記錄,第二步是插入新記錄。原來(lái)的記錄在old表中,新記錄在new表中。觸發(fā)器中new.price存放的是新價(jià)格,old.price是原來(lái)的價(jià)格。
create trigger trigger_limitIncreasePrice BEFORE UPDATE ON product FOR EACH ROW BEGIN DECLARE mesg varchar(10); if (NEW.price-OLD.price)*100/OLD.price > 20 then select XXXX into mesg; else set mesg='更改成功'; end if; END 驗(yàn)證觸發(fā)器 update product set price=20 where pid=1;
create trigger trigger_limitSex before insert on personinfo for each row begin declare mesg varchar(10); if NEW.sex='男' or NEW.sex='女' then set mesg='更改成功'; else select xxxx into mesg; end if; End 驗(yàn)證觸發(fā)器
insert into personinfo VALUES('孫悟空', '難','18900000000'); insert into personinfo VALUES('唐僧', '男','18900000001'); B、限制手機(jī)列的取值類型和長(zhǎng)度 創(chuàng)建觸發(fā)器,只允許phone列輸入的手機(jī)號(hào)只能是11位數(shù)字,且第一位數(shù)字是1。
create trigger trigger_limitPhone before insert on personinfo for each row begin declare mesg varchar(10); if NEW.phone regexp '[1][0-9]{10}' then set mesg='插入成功'; else select xxxx into mesg; end if; End 驗(yàn)證觸發(fā)器,如果手機(jī)列插入的值位數(shù)不對(duì)或者第一位不是1,插入都將失敗。 insert into personinfo VALUES('唐僧', '男','2890000001');
create trigger trigger_insert before insert on personinfo for each row begin insert into review values(user(),'insert',new.sname,now()); End 插入personinfo表一條記錄 insert into personinfo values('孫悟空', '男', '13008080808'); 查看review表中增加的INSERT記錄 select * from review
B、創(chuàng)建觸發(fā)器記錄刪除操作
create trigger trigger_delete after DELETE on personinfo for each row begin insert into review values(user(),'delete',old.sname,now()); End 從personinfo刪除一條記錄 delete from personinfo where sname='孫悟空'; 查看reivew表中增加的DELETE記錄
C、創(chuàng)建觸發(fā)器記錄修改操作
create trigger trigger_update after UPDATE on personinfo for each row begin insert review values(user(),'update',new.sname,now()); End 更新personinfo表中名字為‘孫悟空’的phone。 update personinfo set phone='189080808' where sname='孫悟空'; 查看reivew表中增加的UPDATE記錄