create trigger trigger_order AFTER INSERT ON orders FOR EACH ROW BEGIN UPDATE product SET pnum=pnum-NEW.onum where pid = NEW.pid; END 插入两个订单
INSERT INTO orders(pid, onum)VALUES(1, 10); INSERT INTO orders(pid, onum)VALUES(2, 5); 查看产品表,可以看到对应的产品数量减少。操作由订单表的Insert触发器完成。 MySQL数据库高级(五)——触发器 在订单表上创建新的触发器,当订单定的某产品产品数量大于产品库存,禁止下订单,也就是禁止在订单表中插入记录。 一张表中只能有一个INSERT类型的触发器,先删除INSERT触发器。 drop trigger trigger_order; MySQL不能在触发器中通过回滚事务取消操作,但如果触发器的SQL语句执行过程中出现错误,会自动撤销操作,曲线实现事务回滚。
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 插入订单,看看如果库存不够是否还能够插入成功。 INSERT INTO orders(pid, onum)VALUES(1, 110);
2、实现安全 A、限制插入记录的日期 在订单表上创建插入触发器,周六周日不允许下订单。
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 验证上面创建的触发器是否工作正常,看看当前时间是否是周六周日,向订单表插入记录,检查是否能够成功。 insert into orders(pid,onum) values (3,30) B、限制数据更改的范围 在产品表上创建更新触发器,限制产品价格一次上调不能超过20%。 触发器设置成before update,在更改前检查价格增长幅度是否超过20%,如果超过就产生错误,取消操作。 更新操作分为两步,第一步是删除原来的记录,第二步是插入新记录。原来的记录在old表中,新记录在new表中。触发器中new.price存放的是新价格,old.price是原来的价格。
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 验证触发器 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 验证触发器
insert into personinfo VALUES('孙悟空', '难','18900000000'); insert into personinfo VALUES('唐僧', '男','18900000001'); B、限制手机列的取值类型和长度 创建触发器,只允许phone列输入的手机号只能是11位数字,且第一位数字是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 验证触发器,如果手机列插入的值位数不对或者第一位不是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、创建触发器记录删除操作
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、创建触发器记录修改操作
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记录