外观
使用触发器
触发器的执行顺序
下面通过一个实例演示触发器的执行顺序。
create trigger before_in before insert on employees
for each row insert into timeinfo (info) values ('before');create trigger after_in after insert on employees
for each row insert into timeinfo (info) values ('after');在执行这两部分代码之后,向employees表中插入一条记录后查看数据表timeninfo的插入情况。


可以看到我们插入数据时先是before触发器先被激活,after触发器后被激活。
触发器中不能包含START TRANSCATION、COMMIT或ROLLBACK等关键字,也不能包含CALL语句。触发器执行非常严密,每一环都息息相关,任何错误都可能导致程序无法向下执行。已经更新的数据表是不能回滚的,故在设计过程中一定要注意触发器的逻辑严密性。
使用触发器维护冗余数据
在数据库中,冗余数据的一致性非常重要。为了避免数据不一致的问题的发生,尽量不要人工维护数据,建议是用编程自动维护。例如通过触发器实现。下面我们使用触发器实现当添加一条商品销售信息时自动修改库存信息表中的库存数量。步骤如下
创建库存表tb_stock,包含字段id(编号)、good_name(商品名称)、number(库存)。
create table tb_stock ( id int auto_increment, good_name varchar(50) not null, number int not null, constraint tb_stock_pk primary key (id) );
运行结果 创建商品销售表tb_sell,包括字段id(编号)、good_name(商品名称)、good_type(商品类型)、number(购买数量)、price(价格)、amount(订单总价)。
create table tb_sell ( id int auto_increment, good_name varchar(50) not null, good_type int not null, number int not null, price decimal(10, 2) not null, amount int not null, constraint tb_sell_pk primary key (id) );
运行结果 向库存信息表tb_stock中添加一条商品库存信息,代码如下。
insert into tb_stock (good_name,number) values ('马克杯 350ML',100);
运行结果 为商品销售信息tb_sell创建一个触发器,名称为auto_number,实现向商品销售信息表tb_sell中添加数据时自动更新库存信息表tb_stock的商品销售数量,代码如下。
delimiter // create trigger auto_number after insert on tb_sell for each row begin declare sellnum int; select number from tb_sell where id = new.id into @sellnum; update tb_stock set number = number - @sellnum where good_name = '马克杯 350ML'; end //
运行结果 向商品销售记录表tb_sell中插入一条商品销售信息,代码如下。
insert into tb_sell (good_name,good_type,number,price,amount) values ('马克杯 350ML',1,1,29.80,29.80);
查看库存信息表tb_stock中商品“马克杯 350ML”的库存数量,代码如下。
select * from tb_stock where good_name = '马克杯 350ML';
运行结果
从上图可以看到,再插入一条销售记录后,库存变量变成了99,原来是100。