mysql——触发器
触发器的含义与作用
触发器(trigger)是由事件来触发某个操作,主要是由insert update delete等事件来触发某种特定的条件;
满足触发器的触发条件时,数据库就会执行触发器定义的程序语句,
比如:当学生表当中增加了一个学生记录,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录。就执行一次计算学生的总数量的操作。这可以保证每次增加学生后的记录统计一直保持最新。
触发器的定义语句
# 单个执行语句的触发器
create trigger 触发器名 after|before 触发事件 on 表名 for each row 执行语句
# 多个执行语句的触发器
delimiter && //把分隔符改成&&(当然了可以自定义为其他的)(注意有空格) create trigger 触发器名 after|before 触发事件 //after表示在触发事件之后执行语句;before表示在之前执行语句 on 表名 for each row //on表示在哪张表之上 begin 执行语句1; 执行语句2; ........; end && //以&&表示结束这条语句 delimiter ; //把分隔符改回来(注意有空格)
以一个简单的例子理解触发器
A表 <--- 触发器t1 ---> B表
当A表insert一条记录之后(触发事件),
触发器将统计A表中的总记录数(执行语句1),并写入B表中(执行语句2),
当用户每次想要得到A表的结果(总记录数),只需要到B表去查,从而避免了#select count(*) from A;这条语句的查询负担
#创建A表 create table A( userid int(10), username varchar(20), old int(4), address varchar(30)); #创建B表 create table B( insert_time time, //insert_time属性用于记录insert的时间 count int); //count属性用于记录A表的总记录数 #创建触发器t1的过程如下 delimiter && create trigger t1 after insert on A for each row begin declare acount int; set acount=( select count(*) from A ); insert into B values(now(),acount); end && delimiter ;
#验证:
insert into A values('008','lyj88','100','gz');
......
select * from B;
+-------------+-------+
| insert_time | count |
+-------------+-------+
| 00:41:39 | 5 |
+-------------+-------+
查看触发器信息的语句
#查询当前数据库中的所有触发器信息 show triggers \G; #查询全部触发器的详细信息 (所有触发器的信息都存在information_schema库中的triggers表里面) use information_schema; select * from information_schema.triggers \G; #查询单个触发器的详细信息 select * from triggers where trigger_name='product_af_delete'\G;
删除触发器的语句
drop trigger 触发器名;
一道练习题
#创建product表 create table product( id int(10) primary key not null unique, name varchar(20) not null, function varchar(50), company varchar(20) unique, address varchar(50) ); #创建operate表 create table operate( op_id int(10) not null, op_type varchar(20) not null, op_time time not null ); #创建 product_bf_insert 触发器 delimiter && create trigger product_bf_insert before insert on product for each row begin declare count1 int(10); set count1=( select count(*) from product ); insert into operate values(count1,'insert',now()); end && delimiter ; #创建product_af_update触发器 delimiter && create trigger product_af_update after update on product for each row begin declare count2 int(10); set count2=( select count(*) from product ); insert into operate values(count2,'update',now()); end && delimiter ; #创建product_af_delete触发器 delimiter && create trigger product_af_delete after delete on product for each row begin declare count3 int(10); set count3=( select count(*) from product ); insert into operate values(count3,'delete',now()); end && delimiter ; #执行inset、update、delete语句,可以在operate表中查询到相关的记录 insert into product values(100,'p2','ko','google','ch'); insert into product values(101,'p2','ko','baidu','ch'); update product set function='ok' where id=100; delete from product where id=101; select * from operate; +-------+---------+----------+ | op_id | op_type | op_time | +-------+---------+----------+ | 0 | insert | 01:54:00 | | 1 | insert | 03:15:32 | | 2 | update | 03:21:44 | | 1 | delete | 03:28:27 | +-------+---------+----------+