mysql 触发器的详细用法

3/7/2017来源:SQL技巧人气:1381

触发器:

一类特殊的数据库程序,可以监视某种数据的操作(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 tr1 after insert on orders for each row begin update goods set godnum = godnum-new.godnum where id = new.id; end;

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

触发器监听:delete

create trigger tr2 after delete on orders for each row begin update goods set godnum= godnum+old.godnum where id = old.id; end

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

触发器监听:update

create trigger tr3 after update on orders for each row begin update goods set godnum= godnum+(old.godnum-new.godnum) where id = old.id; end

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

触发器声明变量用法:

create trigger tr4 before insert on orders for each row begin 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触发程序的执行过程中出现错误,将导致调用触发程序的整个语句的失败。对于事务性表,如果触发程序失败(以及由此导致的整个语句的失败),该语句所执行的所有更改将回滚。对于非事务性表,不能执行这类回滚,因而,即使语句失败,失败之前所作的任何更改依然有效。