一、创建触发器
语法
CREATE TRIGGER <触发器名称> --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
{ BEFORE | AFTER } --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE } --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
ON <表名称> --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句> --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。
首先建立数据库
> create database test_tri;
> use test_tri;
首先建立两个表t_dept、t_diary
> create table t_dept(
> deptno int(11),
> dname varchar(20),
> loc varchar(40));
> create table t_diary(
> diaryno int(11) primary key auto_increment,
> tablename varchar(29),
> diarytime datetime);
创建有一条执行语句的触发器
> create trigger tri_diarytime
before insert
on t_dept for each row
insert into t_diary values(null,'t_dept',now());
检验触发器功能,向表中插入一条记录
> insert into t_dept values(1,'dept1','guangzhou');
查看两个表t_dept、t_diary
> select * from t_dept;
> select * from t_diary;
继续插入数据并关系表的变化
> insert into t_dept values(2,'dept1','shenzhen');
创建包含多条执行语句的触发器
Delimiter //
Create trigger tri_diarytime2
After insert
On t_dept for each row
Begin
Insert into t_diary values(null,’t_dept’,now());
Insert into t_diary values(null,’t_dept’,now());
End
//
Delimiter;
插入一条数据记录
> insert into t_dept values(3,'dept3','beijing');
查看两个表t_dept、t_diary
> select * from t_dept;
> select * from t_diary;
二、查看触发器
使用show语句查看已经存在的触发器
> show triggers \G #注意G后不要带分号,了解表中参数的含义
通过查看系统表trigger 实现查看触发器
查看系统表triggers的表结构
> use information_schema;
> desc triggers;
查看系统表triggers中的所有记录
> select * from triggers \G
查看指定触发器的详细信息
> select * from triggers where trigger_name='tri_diarytime' \G
三、删除触发器
使用drop语句删除已经存在的触发器
> drop trigger tri_diarytime;
查看删除是否成功
> show triggers;
案例分析
创建一个触发器,使得每次更新一次persons表的num字段后,都要更新sales表对应的sum字段。
> create table persons(name varchar(40),num int);
> create table sales(name varchar(40),sum int);
> create trigger tri_num_sum
> after insert on persons
> for each row
> insert into sales values(new.name,7*new.num);
> insert into persons values(
> 'xiaoxiao',20),
> ('xiaohua',69);
> select * from persons;
> select * from sales;
Comments