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 |
+-------+---------+----------+
原文地址:https://www.cnblogs.com/snsdzjlz320/p/5734246.html