触发器
触发器(trigger)是 MySQL 提供给程序员和数据分析员来保证数据完整性的一种方法,他是与表时间相关的特殊存储过程,他的执行不是由程序调用,也不是手动启动,而是由事件来触发,比如当时对一个表进行 DML
操作(insert
,delete
,update
)时就会激活他执行。
要素
- 监视对象:table
- 监视事件:insert,update,delete
- 触发时间:before,after
- 触发事件:insert,update,delete
语法
create trigger trigger_name trigger_time trigger_event on tbl_name for each row [trigger_order] trigger_body;
- trigger_bogy:可以使一个语句,也可以是多个语句;多个语句写在
BEGIN ... END
之间; trigger_time: {BEFOER | AFTER}
;trigger_event: {INSERT | UPDATE | DELETE}
;trigger_order: {FOLLOWS | PRECEDES}
准备
create table `work` (
`id` int primary key auto_increment,
`address` varchar(32)
)default charset = utf8 engine = innoDB;
create table `time` (
`id` int primary key auto_increment,
`time` datetime
)default charset = utf8 engine = innoDB;
create trigger trig_test1 after insert on `work` for each row insert into `time` values (null, now());
NEW 和 OLD
在 INSERT
类型触发器中,NEW
用来表示将要(BEFORE
)或已经(AFTER
)插入的新数据;
在 DELETE
类型触发器中,OLD
用来表示将要或已经被删除的源数据;
在 UPDATE
类型触发器中,OLD
用来表示将要或已经被修改的原数据,NEW
用来表示将要或已经修改为的新数据;
NEW.columnName
OLD.columnName
案例
在下订单的时候,对应的商品的库存量要相应减少,即买几个商品就减少多少个库存量。
准备
create table `goods` (
`id` int primary key auto_increment,
`name` varchar(32),
`num` smallint default 0
);
create table `order` (
`id` int primary key auto_increment,
`goods_id` int,
`quantity` smallint comment '下单数量'
);
insert into goods values (null, 'pig', 400);
insert into goods values (null, 'sheep', 500);
insert into goods values (null, 'bear', 600);
insert into `order` values (null, 1, 3);
insert into `order` values (null, 2, 4);
需求
客户修改订单数量,在原来购买数量的基础上减少 2 个;
delimiter //
create trigger trig_order_1 after insert on `order` for each row
begin
update goods set num = num - 2 where id = 1;
end//
delimiter ;