时间:2021-07-01 10:21:17 帮助过:2人阅读
创建触发器语法:
create trigger 触发器名称
after/before(触发时间)
insert/update/delete(触发事件)
on 表名(监视地址)
for each row--此句在MySQL中是写死的,只有行触发器,在oracle中还有表触发器
begin
sql1
...
sqlN
end;
触发器举例:
需求:
商品表:goods
订单表:ord
当下一个订单时,对应的商品要相应减少(买几个商品减少几个库存)、
分析:
监视谁:ord
监视动作:insert
触发时间:after
触发事件:update
create trigger t1
after
insert
on ord
for each row
begin
update goods set num=num-2 where gid=1;
end;
深入分析会发现,该触发器所有数据写死,每次不管买任何商品,都只会减少gid=1的商品。
如何在触发器引用行的值
对于insert而言,新增的行用new来表示;行中的每一列的值,用new.列名来表示。
对于delete而言,删除的行用old来表示,行中的每一列的值,用old.列名来表示。
对于update而言,被修改的行,修改前的数据用old来表示,old.列名引用被修改前的行中的值;修改后的数据用new来表示,new.列名引用被修改后的行中的值。
举例升级:
create trigger t1
after
insert
on ord
for each row
begin
update goods set num=num-new.much where gid=new.gid;
end;
注意:老版本的MySQL默认遇到分号结束,如上写法会提示错误,需要先用delimite $将默认分号结束改成功“$”结束(当然也可改成其他结束符),然后end后面跟$即可,begin后的语句仍用分号结束即可。
删除触发器语法:drop trigger 触发器名;
查看所有触发器:show triggers;
before与after的区别
after是先完成数据的增、删、改,再触发。意味着无法影响前面的增删改。
before是先完成触发,再进行数据的增、删、改。触发的语句先于监视的增删改发生,意味着我们有机会审查、判断、修改即将发生的操作。
典型案例:
对于所下订单进行判定,若订单数量>5则认为是恶意订单,强制将订单数量改成5.
实现结果:
基本sql语句--触发器
标签: