--触发器是一类特殊的监控增删改操作,并产生相应的增删改的操作
--1,监视谁 2,监视动作 3,监视时间(之前或之后) 4,触发的事件
--触发器的简单语法
create trigger 触发器名字  after/before(触发时间)
insert/delete/update(监视事件) on 表名 (监视地址)
for each row begin sql语句; end;
--因为一条sql语句只能有一个边界符,所以上面语句会发生错误,用delimiter $
--将边界符改为$ 这样就不会发生冲突
--同一个表在同一时间同意动作不能有不同的触发器
--查看已有的触发器 show triggers;
--删除指定的触发器 drop trigger 触发器名字;
--建表语句
create table goods(
goods_id int not null,
goods_name varchar(30) not null default '',
goods_num int
)engine myisam charset utf8; --插入数据
insert into goods values (1,'cat',32),(2,'dog',42),(3,'rab',43); --创建订单表
create table ord(
id int not null,
goods_id int not null,
num int not null default 0
)engine myisam charset utf8;
--更改边界,最后不需要分号;
delimiter $
--创建触发器,当ord表插入一条数据(1,1,1)时 商品cat数量减1
create trigger trig1
after
insert
on ord
for each row
begin
update goods set goods_num=goods_num-1 where goods_id=1;
end$ --然后插入一条数据
insert into ord values (1,1,1)$
--goods表确实减少了1,但是这个触发器不具有通用性,
--不管买几个商品和买多少商品,总是cat商品减1
drop trigger trig1$ --旧的一行数据对象old,新的一条数据对象new
create trigger trig2
after
insert
on ord
for each row
begin
update goods set goods_num=goods_num-new.num where goods_id=new.goods_id;
end$ --这个触发器具有通用性 --监控delete语句,当删除订单时,需要再把商品加回来
create trigger trig3
after
delete
on ord
for each row
begin
update goods set goods_num=goods_num+old.num where goods_id=old.goods_id;
end$ --监控update语句,当更新表时,产生相应的操作,在不修改商品类型的情况
create trigger trig4
after
update
on ord
for each row
begin
update goods set goods_num=goods_num+old.num-new.num where goods_id=new.goods_id;
end$ --在这种情况下,会出现爆仓的情况,因为更新的数据可能超过商品的库存量
drop trigger trig4$
create trigger trig4
before
update
on ord
for each row
begin
declare gnum int;
select goods_num into gnum from goods where goods_id=new.goods_id;
if (new.num-old.num)>gnum then
set new.num=gnum+old.num;
end if;
update goods set goods_num=goods_num+old.num-new.num where goods_id=new.goods_id;
end$ --insert也会出现这种情况,也要更改一下
drop trigger trig2$
create trigger trig2
before
insert
on ord
for each row
begin
declare gnum int ;
select goods_num into gnum from goods where goods_id=new.goods_id;
if new.num>gnum then
set new.num=gnum;
end if;
update goods set goods_num=goods_num-new.num where goods_id=new.goods_id;
end$

最新文章

  1. js_面向对象
  2. 基于Chrome内核(WebKit.net)定制开发DoNet浏览器
  3. [ASE][Daily Scrum]11.30
  4. 自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
  5. MongoDB入门一:安装与配置
  6. try-catch和throw,throws的区别和联系
  7. 十五、mysql 分区之 分区管理
  8. 【更新链接】U盘启动制作工具(UDTOOL) v3.0.2014.0427
  9. 中间件(Middleware)
  10. 如何在Eclipse中添加Servlet-api.jar的方法
  11. SQL---约束---add constraint方法添加约束
  12. Python内置函数(21)——filter
  13. SQL Data Discovery and Classification
  14. delphi 调试查看变量值
  15. Exp 8 Web基础
  16. oracle impdp将导出用户的所有对象导入至另一个用户下,生成的触发器语句问题处理
  17. follow
  18. 命令行找不到genstrings问题tip
  19. centos安装pip扩展包
  20. tomcat启动闪退之内存不足及显著优化

热门文章

  1. C#的dll被其他程序调用时,获取此dll正确的物理路径
  2. CodeForces 706A Beru-taxi (数学计算,水题)
  3. PicklingError: Can't pickle <type 'generator'>: it's not found as __builtin_
  4. php redis安装
  5. POI Excel导出样式设置
  6. Android学习第一课
  7. 【M8】了解各种不同意义的new和delete
  8. 从零开始学android开发- layout属性介绍
  9. Codeforces GYM 100114 C. Sequence 打表
  10. 使用C# 实现文件锁