MySQL 从 5.0 开始支持触发器,触发器一般作用在表上,在满足定义条件时触发,并执行触发器中定义的语句集合,下面我们就来一起认识一下触发器。
举个例子来认识一下触发器:比如你有一个日志表和金额表,你每录入一笔金额就要进行日志表的记录,你会怎么样?同时在金额表和日志表插入数据吗?如果有了触发器,你可以直接在金额表录入数据,日志表会自动插入一条日志记录,当然,触发器不仅只有新增操作,还有更新和删除操作。
创建触发器我们可以用如下的方式创建触发器
create trigger triggername triggertime triggerevent on tbname for each row triggerstmt上面涉及到几个参数,我知道你有点懵逼,解释一下。
triggername:这个指的就是触发器的名字
triggertime:这个指的就是触发器触发时机,是 BEFORE 还是 AFTER
triggerevent: 这个指的就是触发器触发事件,一共有三种事件:INSERT、UPDATE 或者 DELETE。
tbname:这个参数指的是触发器创建的表名,在哪个表上创建
triggerstmt: 触发器的程序体,也就是 SQL 语句
所以,可以创建六种触发器
BEFORE INSERT、AFTER INSERT、BEFORE UPDATE、AFTER UPDATE、BEFORE DELETE、AFTER DELETE
上面的 for each now 表示任何一条记录上的操作都会触发触发器。
下面我们通过一个例子来演示一下触发器的操作
我们还是用上面的 procuct 表做例子,我们创建一个 product_info 产品信息表。
create table product_info(p_info varchar(20));然后我们创建一个 trigger
我们在 product 表中插入一条数据
insert into product values(4,"pineapple",15.3);我们进行 select 查询,可以看到现在 product 表中有四条数据
我们没有向 product_info 表中插入数据,现在我们来看一下 product_info 表中,我们预想到是有数据的,具体来看下
这条数据是什么时候插入的呢?我们在创建触发器 tg_pinfo 的时候插入了的这条数据。
删除触发器触发器可以使用 drop 进行删除,具体删除语法如下
drop trigger tg_pinfo;和删除表的语法是一样的
查看触发器我们经常会查看触发器,可以通过执行 show triggers 命令查看触发器的状态、语法等信息。
另一种查询方式是查询表中的 information_schema.triggers 表,这个可以查询指定触发器的指定信息,操作起来方便很多
触发器的作用在添加一条数据前,检查数据是否合理,例如检查邮件格式是否正确
删除数据后,相当于数据备份的作用
可以记录数据库的操作日志,也可以作为表的执行轨迹
注意:触发器的使用有两个限制
触发程序不能调用将数据返回客户端的存储程序。也不能使用 CALL 语句的动态 SQL 语句。
不能在触发器中开始和结束语句,例如 START TRANSACTION