mysql 触发器

监听数据进行操作
    在当前的表上 设置一个对每行数据的监听器。监听相关事件
    每当事件发生时候 会执行一段由sql完成的一段功能性代码
    
    不可以在同一个事件上面绑定多个触发器

触发器的元素
事件、执行代码
事件:insert  delete  update     
事件的时机  执行之前 执行之后   After  Before     由时机和时间一起 形成了六种事件
before insert           before delete         before update
after  insert          after delete             after update


管理触发器
删除触发器 
drop trigger  aaa;
查看触发器 
show create trigger aaaa;

在触发器内 获得触发程序时候的数据
    利用触发器上面的 old  和 new  来完成
    old   监听事件所在表上 在事件发生之前的数据
    new  在监听事件所在的表上 在事件发生之后的数据  

如果一个触发器由多条sql语句组成
 语句组成语句块 (begin end) 用来标识语句块
 语句块的语句需要多里的语句结束符 分号

命令行 由于触发器程序内使用分号作为语句结束符
那么命令号执行到分号时候就理解成 触发程序内子语句结束 而不是整个触发器结束
应该通过修改命令行语句符号结束符 达到目的
delimiter 可以修改结束符
delimiter  $ 



触发器:

能监视:增、删、改

能触发:增、删、改

触发器 监视    监视事件  增删改 监视事件 after (发生之后)/before(发生之前)  触发事件 增删改

之后:比如你吃好饭之后,出去就要收钱

之前:比如你进公园之前,要票


创建触发器

监视地点  表名

监视事件 insert/update/delete

监视事件  alter/before

查看触发器 show triggers;

Create trigger  triggerName 

Alter/before  insert/update/delete on 表名

For each row   这句话是行触发器 mysql里面没有表触发器

Begin

   Sql 语句 一句或者多句 必须是 insert/update/delete  ;必须是分号结束

End


写触发器的时候 先 delimiter  $  设置$是结束符


create trigger  tg1 

after insert on o

for each row

begin

update g set num = num - 3 where id = 2;

end;


删除 触发器

Drop trigger  triggerName


如何引用触发器的值

对于insert而言 新增的行 用new来表示

行中的每一列 用 new.列名来表示

create trigger  tg1 

after insert on o

for each row

begin

update g set num = num - new.much where id = new.gid;

end;


删除订单的数量 库存相应改变

create trigger tg3

after delete on o

for each row 

begin

update g set num = num + old.much where id = old.gid;

end$


对于delete 可以用old来表示数据 

对于 insert 可以用new来表示

对于update 可以用修改之前用old 修改之后用new


修改订单 

create trigger tg4

after update on o

for each row

begin

update g set num = num + old.much - new.much where id = old.gid;

end$


反正他是自动查询修改那一行的列 就算你sql语句里面没有列 他也会自己查询

After 是先完成 增删改 然后再触发

触发语句 晚于增删改,无法影响前面的增删改的动作

Before  是先完成触发,然后增删改

触发的语句先于监视的增删改发生


Create  trigger tg5

Before insert on o 

For each row

Begin

 If new.mach  >5 then 

  Set  new.macth = 5;

End if;

Update g set num = num -new.much where id = new.gid;

End$





DEMO:
    create trigger  名字 事件  执行代码 

    create trigger  aaa  after update  on t1  for each row 
    update t2 set money=money-20 where id = 1

  create trigger  aaaa  before update  on t1  for each row 
    update t2 set money=money+20 where id = 1

    create trigger aaa after update on t1 for each row
    update t2 set money = money + (old.money-new.money);











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值