触发器 trigger
1、触发器是指事先为某张表绑定一段代码,当表中某些内容发生改变(增insert、删delete、改update)时,系统自动触发绑定的那段代码并执行。比如 一旦订单表里插入新订单,商品的库存数自动减N.
2、触发器的三要素:
事件因素:insert、删delete、改update
触发时间:前before、后after
触发对象:表中每条记录,即整个表
那么每张表可以有6个触发器(增、删、改3个事件的前和后)
3、创建触发器
delimiter--自定义符号
create trigger+触发器名称+触发器时间+事件类型 on 表名 for each row;
begin--触发器内容的开始
---触发器内容主体
end--触发器内容结束
delimiter.--恢复语句结束符
4、以商品表goods 和订单表odrer举例说明触发器,sql语句如下:
创建商品表:
create table goods(
in int primary auto_increment,
name varchar(20) not null,----- not null:意思是不允许给这个字段插入空值
price decimal(10,2) default 0,------------decimal一种数据类型,decimal(5,2)表示一共5位数,小数位2位,整数位5-2位
default:当没有给此字段插入值时,默认给的值
inventory int comment '商品库存量'-----comment 类似注释,备注说明的意思
)
create table goods( id int primary key auto_increment, name varchar(20) not null, price int, inventory int );
插入商品:
insert into goods values (1,‘Apple’,11,100),(2,‘Pear’,21,100);
创建订单表
create table orders (id int primary key auto_increment, good_id int,good_num int);
创建触发器
delimiter $$--临时修改语句结束符
create trigger after_order after insert on orders for each row
begin---触发器主体内容开始
update goods set invenment=invenment-1 where id=1;--触发器主体内容,每行要以分号;结束
end---触发器主体内容结束
$$--结束语句
deloimiter;恢复语句结束符
使用触发器
由结果可以看出,在给订单表添加一条记录后,商品表中对应的商品库存数减了1(先不管数量应该减10)
触发器的触发对象和事件类型,一定不能和触发主体相同,否则容易造成死循环