(15)mysql中的触发器

概述

触发器,顾名思义就是当某个事情(事件)发生时候,执行某一段程序。触发器有四大要素:监视地点(table_name)监视事件(insert/update/delete)触发时间(before/after)触发执行程序(insert/update/delete)

语法

#创建触发器
create trigger triggerName
触发时间 监视事件 on 表名
for each row
begin
sql语句(触发事件)
end
————————————————————————————————————
#删除触发器
drop trigger [database_name.]trigger_name;
————————————————————————————————————
#查看触发器
show triggers;
  • 触发器只能创建在永久表(permanent table)上。
  • 同一个表 、同一个触发时间、相同的监视事件,只能定义一个触发器。
  • 使用old(更新前的行数据)new(更新后的行数据)来引用触发器中变化的记录内容。
  • 触发器只支持行级触发,不支持语句级触发,因此当处理大数据集的时候可能效率很低。。
  • 触发执行程序不能调用将数据返回客户端的存储过程/函数,但允许存储程序通过参数(即out/inout参数)将数据返回触发执行程序。
  • 触发器不能执行事务操作。
  • 触发器不能保证原子性,例如在MYISAM中,当一个更新触发器在更新一个表后,触发对另外一个表的更新,若触发器失败,不会回滚第一个表的更新。InnoDB中的触发器和操作则是在一个事务中完成,是原子操作。
  • after和before的区别:after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;before是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作

作用

  • 安全:可以基于数据库的值使用户具有操作数据库的某种权利。例如:可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。
  • 审计:可以跟踪用户对数据库的操作。例如:审计用户操作数据库的语句。
  • 实现复杂的数据完整性规则:实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。例如,触发器可回退任何企图吃进超过自己保证金的期货。
  • 实现复杂的非标准的数据库相关完整性规则:触发器可以对数据库中相关的表进行连环更新。例如:在修改或删除时级联修改或删除其它表中的与之匹配的行。
  • 同步实时地复制表中的数据。
  • 自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。例如,如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据。

举例

创建两张表goods(商品表)和order_t(订单表)

举例一

我要下一个3个商品1的订单,需要两步走,插入一条数据到订单表,更新商品表中的商品1的num列。

#没有使用触发器
insert order_t(gid,much) values(‘1‘,3);
update goods set num=num-3 where id=1;

现在,我先创建一个触发器

delimiter $$
create trigger test_tr1
after insert on order_t
for each row
begin
update goods set num=num-3 where id=1;
end $$
delimiter ;

创建完了以后,我只需执行一条就可以完成上面的任务。

#使用触发器
insert order_t(gid,much) values(‘1‘,3);

会发现商品1的数量变为7了,说明在我们插入一条订单的时候,触发器自动帮我们做了更新操作。

举例二

现在会有一个问题,因为我们触发器里面num和id都是写死的,所以不管我们买哪个商品,最终更新的都是商品1的数量。比如:我们往订单表再插入一条记录:insert into o(gid,much) values(2,3),执行完后会发现商品1的数量变4了,而商品2的数量没变,这样显然不是我们想要的结果。我们需要改改我们之前创建的触发器。

对于insert而言,新插入的行用new来表示,行中的每一列的值用new.列名来表示。

改触发器

delimiter $$
create trigger test_tr1
after insert on order_t
for each row
begin
update goods set num=num-new.much where id=new.gid;
end $$
delimiter ;

再来测试一下,插入一条订单记录:

insert into o(gid,much) values(2,3)

执行完发现商品2的数量变为7了,现在就对了。

现在还存在两种情况:

举例三

当用户撤销一个订单的时候,我们这边直接删除一个订单,我们是不是需要把对应的商品数量再加回去呢?

对于delete而言:原本有一行,后来被删除,想引用被删除的这一行,用old来表示,old.列名可以引用被删除的行的值。

delimiter $$

create trigger test_tri2
after delete on order_t
for each row
begin
update goods set num = num + old.much where id = old.gid;
end $$

delimiter ;

再执行

delete from order_t where id = 2;

会发现商品2的数量又变为10了。

举例四

当用户修改一个订单的数量时,我们触发器修改怎么写?

对于update而言:被修改的行,修改前的数据,用old来表示,old.列名引用被修改之前行中的值;修改的后的数据,用new来表示,new.列名引用被修改之后行中的值。

delimiter $$

create trigger test_trg3
after update on order_t
for each row
begin
update goods set num = num+old.much-new.much where id = old/new.gid;
end $$

delimiter ;

我们再修改插入的订单记录:

update order_t set much = 5 where id = 1;

我们变为买5个商品1,这时候再查询商品表就会发现商品1的数量只剩5了,说明我们的触发器发挥作用了。

参考

http://blog.csdn.net/tonyxf121/article/details/8255782

http://www.cnblogs.com/zzwlovegfj/archive/2012/07/04/2576989.html

时间: 2024-09-30 16:16:53

(15)mysql中的触发器的相关文章

mysql中的触发器和事务的操作

触发器 语法 创建触发器: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt; trigger_time是触发程序的动作时间.它可以是BEFORE或AFTER trigger_event指明了激活触发程序的语句的类型. trigger_event可以是下述值之一: ·             INSERT:将新行插入表时激活触发程序,例如,通过INSERT.LO

15.Mysql中的安全问题

15.SQL中的安全问题15.1 SQL注入简介SQL是用来和数据库交互的文本语言.SQL注入(SQL Injection)是利用数据库的外部接口将用户数据插入到实际的SQL中,以达到入侵数据库乃至操作系统的目的.产生的原因主要由于程序没有对用户输入数据进行严格的过滤,导致非法SQL语句的执行.SQL注入可能的危害包括:读取.修改.删除数据,获取用户名.密码等信息,获取管理员权限等.SQL注入很难防范,不能通过操作系统补丁.数据库升级.防火墙进行拦截.例子:select * from user

Oracle使用触发器和mysql中使用触发器的比较——学习笔记

一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志,自动通知好友,其实就是在增加日志的时候做一个出发,再向表中写入条目. --触发器的效率很高 举例:论坛的发帖,每插入一个帖子都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,这时使用触发器效率会很高. 二.Oracle 使用 PL/SQL 编写触发器 1.--PL/SQL创建触发器的一般语法

Mysql中的触发器

阅读目录 什么是触发器 特点及作用 例子:创建触发器,记录表的增.删.改操作记录 弊端 什么是触发器 简单的说,就是一张表发生了某件事(插入.删除.更新操作),然后自动触发了预先编写好的若干条SQL语句的执行: 特点及作用 特点:触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行: 作用:保证数据的完整性,起到约束的作用: 例子:创建触发器,记录表的增.删.改操作记录 接下来将创建user和user_history表,以及三个触发器tri_insert_u

MySQL中的触发器应用

直接上代码: /*数据库 - udi_ems_test*********************************************************************内容:在plan_material_summary_info总表中删除数据前,对当前数据进行备份,保存至plan_material_summary_info_backup中*/DELIMITER $$USE `udi_ems_test`$$DROP TRIGGER IF EXISTS `plan_mater

【MySQL笔记】触发器,存储过程和函数

一.触发器 触发器(TRIGGER):是由事件来触发某个操作.当数据库系统执行这些事件时,就会激活触发器执行相应的操作.MySQL从5.0.2版本开始支持触发器. 触发事件:INSERT语句.UPDATE语句和DELETE语句. 1.创建触发器 1.1.创建只有一个执行语句的触发器 CREATE  TRIGGER 触发器名  BEFORE | AFTER  触发事件 ON  表名 FOR  EACH  ROW  执行语句 1.2.创建有多个执行语句的触发器 DELIMITER&& CREA

mysql中的索引、触发器、和事务

一.索引 1.什么是索引 如果把表看做一本书,索引就好像书里的目录或者书签,能帮助你快速找到你要检索的内容,所以叫做索引. 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如 果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合 要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已 经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置.如果表有1000个 记录,通过索引查找记录至少要比

mysql中索引,触发器,事务,存储引擎的理解

1.索引:作用于表中的某列,并将其进行排序,有助于快速地进行查询. 索引是对数据库表中一个或多个列的值进行排序的数据结构,是用于提高在数据库表中访问数据的速度的数据库对象.其实索引相当于一本书的目录,如果没有索引,要想在数据库中查找某一特定的值就需要遍历整个数据库表,但是有了索引之后就可以在索引当中查找,有助于更快地获取信息: 索引可分为聚集索引和非聚集索引: 聚集索引:是按照数据存放的物理位置为顺序的: 非聚集索引中,表数据存储顺序与索引顺序无关:一张表上只能创建一个聚集索引,因为真实数据的物

mysql中触发器

触发器 场景: 日志系统,记录对学生表有哪些操作! 解决的问题: 1, 得到每条学生记录被修改的时机,才能发出记录日志的动作! 2, 执行某段操作,需要得到当前处理的记录的信息! 触发器:一种编程设计!类似js的基于事件编程的程序设计的理念!可以在某个表的每条记录上,设置一个事件,从而对该表上的某些操作,加以监听!一旦所监听的行为出现,则会执行相应的代码. 记录 =button (修改,删除,增加) =click 执行操作 =alert(‘Hello’); 以上的所有行为,都是采用 sql 完成