介绍触发器:mysql响应一下任意一条语句而自动执行的一条MySQL语句
比如:增改插,insert,update,select
用处:1,比如每当一个顾客进入数据表时,都要检查电话号码格式是否正确,email是否正确。
2,每当订购一个产品都要从库存中减去订购的数量。
3,无论何时删除一行都要保留存档一个副本。
这几个例子共同之处在于每个表发生更改时都要自动触发某个事件。
下面举个例子说明删除功能,
第一步创建触发器:
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
其中:
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为BEFORE 或AFTER;
trigger_event:标识触发事件,取值为INSERT、UPDATE或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用BEGIN 和END 包含的多条语句。
由此可见,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。
案例(删除数据库保存删除信息)
第一步:准备相应的表
创建员工表
CREATE TABLE `t_employee` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
添加数据
insert into t_employee (name,age) values ('张三',23),('李四',43),('王五',13),('赵六',63),('陈七',47),('钱八',25)
效果:
创建回收站表
CREATE TABLE `t_trash` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`data` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
第二步 :创建触发器:
CREATE TRIGGER trigger_del_employee
AFTER DELETE ON t_employee
FOR EACH ROW insert into t_trash (`data`) values(
concat('t_employee 被删除,数据有:',OLD.id,'|',OLD.`name`,'|',OLD.age)
)
注:上面的OLD,指的就是当前咱们要删除的表,如OLD.age 就可以拿到咱们刚刚删除的表中的那一行的数据的age列的值。
第三步:测试
现在我去删除employee表中的一条数据:
delete from t_employee where id = 3;
现在我们可以看两张表的数据:
employee表中id为3的数据已经删除
这时候咱们看一下回收站中的数据:
刚才咱们的数据就已经保存在新的表中
⑤.删除触发器
这里要多说一句,咱们自己写代码创建触发器可能会写错,而触发器又不能更新或者覆盖。如果要修改触发器:只能够先删除触发器,然后再重新创建。
语法:
drop TRIGGER 触发器名称;
案例:
drop TRIGGER trigger_del_employee;