一.什么是触发器?
触发器不是由人来执行操作的,而是在执行某一条MySQL语句时自动触发执行的。
二.触发器的优点和缺点
优点:可以使得数据库中的某些指令得到一致性的协调。
缺点:1.每个表只能定义一种触发器
2.多人合作开发时,很容易搞不清楚那些表有触发器,哪个触发器触发了。
3.和存储过程一样触发器的移植性很差
三.创建一个触发器
3.1创建一个简单的触发器
语法:create trigger 触发器名称 (before | after) (insert | update | delete) on 表名 for each row 执行语句
解析:(before | after) (insert | update | delete) on 表名 这是在表中执行插入或者删除或者更改这三个操作之前或者之后设定一个触发器。来看下面的例子:
现在有一张仓库表和一张仓库进货记录表。当我们的仓库插入一个记录时,我们的仓库记录表也通过触发器插入一个记录。
创建表:
#仓库表 create table if not exists Warehouse( pro_name varchar(10) not null, pro_id int primary key auto_increment, pro_intime date not null );
#进货记录表 create table if not exists intime( in_hosue_time datetime not null );
创建触发器:
delimiter // create trigger in_time before insert on warehouse for each row insert into intime values (curtime()); //
解释:首先也是和存储过程定义一样,为了防止遇到分号;就停止编译。
在warehouse(仓库表)中建立一个插入的触发器在插入warehouse表之前在intime(进货时间表)中插入一个时间。
现在来执行:
insert into Warehouse values("方便面",10001,"2018-05-09");
select * from intime;
select * from intime;
结果:
in_hosue_time
'2018-09-27 18:39:04'
3.2创建一个具有多条执行语句的触发器
使用begin 和 end 来隔离即可
3.3注意点
1.首先一张表只能有一种触发器:那么操作类型有三种:插入、删除、更新,执行顺序有两种:after、before。3*2=6,也就是说一张表最多有6种触发器。
2.触发器中start transcation、commit、rollback、call等关键字。
四.删除触发器
语法:drop trigger 触发器名称
例子:
drop trigger in_time;