触发器的含义和作用
如何创建触发器
如何查看触发器
如何删除触发器
触发器是由insert、update和delete等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。例如,当学生表中增加了一个学生的信息时,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录,就执行一次计算学生总数的操作。这样就可以保证每次增加学生的记录后,学生总数是与记录数是一致的。触发器触发的执行语句可能只有一个,也可能有多个。本节将详细讲解创建触发器的方法。
一、语法创建只有一个执行语句的触发器
mysql中,创建只有一个执行语句的触发器的基本形式如下:
create trigger 触发器名 before | after 触发事件on 表名 for each row 执行语句
创建有多个执行语句的触发器mysql中,触发器触发的执行语句可能有多个。创建有多个执行语句的触发器的基本形式如下:
create trigger 触发器名 before | after 触发事件on 表名 for each rowbegin执行语句列表end
下面来具体说说语法1、命名规则
create trigger <--{ before | after }{ insert | update | delete }on for each rowbeginend
触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和mysql中其他对象的命名方式基本相象.
2、触发时间: before | after
触发器有执行的时间设置:insert | update | delete
3、触发事件前后
同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
4.、表
触发器是属于某一个表的:当在这个表上执行插入、
更新或删除操作的时候就导致触发器的激活.
我们不能给同一张表的同一个事件安排两个触发器。
5.、( 步长)触发间隔
触发器的执行间隔:for each row子句通知触发器
每隔一行执行一次动作,而不是对整个表执行一次。
6、 语句
触发器包含所要触发的sql语句:这里的语句可以是任何合法的语句,
包括复合语句,但是这里的语句受的限制和函数的一样。
privileges权限
你必须拥有相当大的权限才能创建触发器(create trigger)。如果你已经是root用户,那么就足够了。这跟sql的标准有所不同。
二、关于旧的和新创建的列的标识在触发器的sql语句中,你可以关联表中的任意列。但你不能仅使用列的名称去标识,那会使系统混淆,因为那里可能会有列的新名(这可能正是你要修改的,你的动作可能正是要修改列名),还有列的旧名存在。因此你必须用这样的语法来标识: new . column_name或者old . column_name.这样在技术上处理(new | old . column_name)新和旧的列名属于创建了过渡变量(transition variables)。
对于insert语句,只有new是合法的;对于delete语句,只有old才合法;而update语句可以在和new以及old同时使用。
三、使用范例先创建两个表、一个订单表,一个订单时间表
create table t_order(order_num int primary key,order_name char(10) not null);create table t_order_time(order_num int primary key,order_time timestamp not null,)
1、创建插入时的触发器
create trigger tri_insertafter insert on t_order for each rowbegininsert into learning.t_order_time(order_num,order_time) values(new.order_num,now());end
然后订单表中插入一条数据
insert into t_order(order_num,order_name) values(1,'电脑');select * from t_order;select * from t_order_time;
这是订单表中插入的数据:
这是订单时间表中自动插入的数据:
2、更新时插入数据
//更新创建触发器create trigger tri_updatabefore update on t_order for each rowbeginupdate learning.t_order_time set order_time=now() where old.order_num=order_num;endupdate t_order set order_name='饼干饼' where order_num=1;select * from t_order;select * from t_order_time;
可以看到,时间已经更新
3、创建删除触发器
//创建删除触发器create trigger tri_deleteafter delete on t_order for each rowbegindelete from learning.t_order_time where old.order_num=order_num;enddelete from learning.t_order where order_num=1;select * from t_order;select * from t_order_time;
可以看到,数据库中都没有数据了。
4、查看触发器
查看触发器是指查看数据库中已存在的触发器的定义、状态和语法等信息。查看触发器的方法包括show triggers语句和查询information_schema数据库下的triggers表等。本节将详细讲解查看触发器的方法。
mysql中,可以执行show triggers语句来查看触发器的基本信息。其基本形式如下:
show triggers ;
mysql中,所有触发器的定义都存在information_schema数据库下的triggers表中。查询triggers表,可以查看到数据库中所有触发器的详细信息。查询的语句如下:
select * from information_schema.triggers;
5、删除触发器drop trigger 触发器名
6、触发器 与存储过程
触发程序不能调用将数据返回客户端的存储程序,也不能使用采用call语句的动态sql
(允许存储程序通过参数将数据返回触发程序)。
而存储过程 可以接受参数,将结果范围给应用程序
