赞
踩
1.概念:
触发器是指在表insert/update/delete之前或者之后,触发并执行触发器中定义的SQL语句结合。
2.作用
可以协助应用在数据库端保证数据的完整性,日志记录,数据校验等操作。
3.触发器中的变量
–new:代表即将要新增的数据,或者即将要更新的数据,或添加之后的数据。
–old:表示修改之前的旧数据,或者将要删除的数据。
4.触发器的类型
–insert型触发器
–update型触发器
–delete型触发器
语法结构:
create trigger trigger_name #trigger即触发器 trigger_name触发器名称
before/after insert/upate/delte #表示在增加,更新,删除操作之前或者之后执行该触发器
on 表名
[for each row] #表示行级触发器
begin
触发器要操作语句
end;
语法:
show triggers;
语法:
drop trigger 触发器名称;
- /*
- 案例1:
- 一张水果仓库表,一张订单表。当生成一张订单时,假如订单某水果数量为10,那么水果仓库表对应的水果数量-10
- */
- #创建水果表,并插入值
- CREATE TABLE `fruit` (
- `id` int(255) NOT NULL AUTO_INCREMENT,
- `f_name` varchar(255) DEFAULT NULL,
- `f_count` int(255) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-
-
- #创建订单表,并插入值
- CREATE TABLE `orders` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(255) DEFAULT NULL,
- `count` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-
-
- #创建订单触发器
- #表示一旦我插入一条订单记录,水果表中的水果数量减少
- create trigger order_trigger
- after insert
- on orders
- for each row
- begin
- #触发器执行的操作
- update fruit
- set f_count=f_count-new.count
- #水果库存数量-订单要购买的数量 new.count表示orders表中中插入的数量
- where f_name=new.name; #new.name 表示orders表中要购买的水果
- end;
- #查看触发器
- show triggers;
- #下单10个香蕉
- insert into orders values (null,"香蕉",10);
- /*
- 执行该语句时,同时执行了
- update fruit
- set f_count=f_count-10
- where f_name="香蕉";
- */
-
-
-
-
- /*
- 案例2:
- 去修改水果的库存时。要记录增加了哪个水果的数量,并且水果增加前的数量,增加了多少,增加后的数量。
- */
- #创建日志记录表
- CREATE TABLE `fruit_log` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `operate_fruit` varchar(255) DEFAULT NULL,
- `old_count` int(255) DEFAULT NULL,
- `add_count` int(255) DEFAULT NULL,
- `new_count` int(255) DEFAULT NULL,
- `operate_time` datetime DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-
-
- #创建更新触发器
- #表示一旦去更新了水果的数量,就将向日志表中插入一条水果的更新记录
- create trigger fruit_update
- after update
- on fruit
- for each row
- begin
- insert into fruit_log values
- (null,new.f_name,old.f_count,
- (new.f_count-old.f_count),
- new.f_count,
- now());
- end;
- #此时,每当去更新水果数量,日志表中对应插入该水果的数量变化值

赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。