mysql 触发器的详细用法

来源:互联网 发布:剑灵金燕捏脸数据 编辑:程序博客网 时间:2024/05/16 08:00

触发器:

一类特殊的数据库程序,可以监视某种数据的操作(insert/update/delete),并触发相关的操作(insert/update/delete),保护数据的完整性

应用场景:数据同步
例如:当一个用户完整信息保存在A/B/C三张表中,传统方法维护用户信息需要将对应的信息使用条SQL语句,依次插入,但是使用触发器的方式的话,我们可以只用插入A表中一条数据,就会自动触发数据插入B/C表的操作,这样就可以通过一个表的操作,同步其他操作,实现自动化维护数据的目的。

触发器语法格式:

creat trigger 触发器名称after/before(触发器工作的时机)update/delete/insert(触发器监听事件)on 表名(触发器监听的目标表)for each row(行级监视,mysql固定写法,oracle不同)begin  sql语句集........(触发器执行动作,分号结尾)end;

删除触发器:drop trigger if exist 触发器名称
查询数据库触发器:show triggers;

行变量:当目标表发生改变时候,变化的行可用行变量表示

new:代表目标表目标行发生改变之后的行
old:代表目标表目标行发生改变之前的行

触发器案例:商品表/订单表(商品数量控制)
这里写图片描述

这里写图片描述
触发器监听:insert

create trigger tr1after insert on ordersfor each rowbeginupdate goods set godnum = godnum-new.godnum where id = new.id;end;

分析:orders表添加新的记录之后,goods表对应的商品数量同步减少对应的商品订单出数量

触发器监听:delete

create trigger tr2after delete on ordersfor each rowbeginupdate goods set godnum= godnum+old.godnum where id = old.id;end 

分析:客户删除订单,恢复商品表对应商品的数量

触发器监听:update

create trigger tr3after update on ordersfor each rowbeginupdate goods set godnum= godnum+(old.godnum-new.godnum) where id = old.id;end 

分析:客户修改订单,商品表对应商品数量同步更新

触发器声明变量用法:

create trigger tr4before insert on ordersfor each rowbegin    declare godSum int default 0;  -- 定义触发器变量    select godNum  into godSum from goods where godId = new.godId; -- 变量赋值    if godSum< new.godNum  then-- 触发器控制逻辑    update goods set godNum = new.godNum where godId = new.godId;    end if;end 

分析:当客户新建订单超过商品表的商品数量则修改商品表,保商品表商品库存量非负

mysql触发器特别注意:

①:for each row:必须填写,保证mysql支持行级控制,oracle同时支持行级控制和语句级控制

②:注意:如果在BEFORE或AFTER触发程序的执行过程中出现错误,将导致调用触发程序的整个语句的失败。对于事务性表,如果触发程序失败(以及由此导致的整个语句的失败),该语句所执行的所有更改将回滚。对于非事务性表,不能执行这类回滚,因而,即使语句失败,失败之前所作的任何更改依然有效。

0 0