专栏首页LanceToBigDataMySQL(十一)之触发器

MySQL(十一)之触发器

上一篇介绍的是比较简单的视图,其实用起来是相对比较简单的,以后有什么更多的关于视图的用法,到时候在自己补充。接下来让我们一起了解一下触发器的使用!

一、触发器概述

1.1、什么是触发器

  触发器(Trigger):监视某种情况,并触发某种操作。在MySQL Server里面也就是对某一个表的一定的操作,触发某种条件(Insert,Update,Delete 等),从而自动执行的一段程序。

  注意:你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了。这跟SQL的标准有所不同。

1.2、触发器作用

  那么为什么要使用数据库对象触发器呢?在具体开发项目时,经常会遇到如下实例:     1)在学生表中拥有字段学生姓名,字段学生总数,每当添加一条学生信息时,学生的总数就必须同时更改。     2)在学生表中还会有学生姓名的缩写,学生住址等字段,添加学生信息时,往往需要检查电话、邮箱等格式是否正确。   上面的例子使用触发器完成时具有这样的特点,需要在表发生改变时,自动进行一些处理。MySQL在触发DELETE/UPDATE/INSERT语句时就会自动执行所设置的操作,其他SQL语句则不会激活触发器。

1.3、触发器四要素

监视地点:table 监听事件:insert/update/delete 触发时间:after/before 触发事件:insert/update/delete

二、触发器用法

 2.1、触发器语法

CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.   { BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后。   { INSERT | UPDATE | DELETE }  --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。   ON <表名称>  --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。   FOR EACH ROW  --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。   <触发器SQL语句>  --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。

   简单的写就是这样:

  create trigger tg_name after/before insert/update/delete on table
  for each row ####这句话在MySQL中是固定的
  begin
  sql语句;
  end$

  分析:由于在以上代码段中的“sql语句;”是以分号结尾,所以需要将MySQL中的结尾标志换成“$”,更换MySQL命令结束标志的命令:delimiter $;        以上触发器语法中的各个段的颜色与四要素对应查看理解。

2.2、创建触发器

  1)创建两张表

  create table tb_goods(id int primary key auto_increment,name varchar(20),num int);
  create table tb_orders(id int primary key auto_increment,good_id int,much int); 

  2)在商品表中插入数据

  insert into tb_goods(name,num)values('商品1',10),('商品2',10),('商品3',10);

  3)假如我们卖了3个商品1

  没有触发器:

    往订单表中插入一条记录:insert into tb_orders(good_id,much) values(1,3);     更新商品表中商品1的剩余数量:update tb_goods set num=num-3 where id=1;    

  创建触发器:   

  create trigger tg_1 after insert on tb_orders
  for each row
  begin
  update tb_goods set num=num-3;
  end$

  这个时候如果执行insert into tb_orders(good_id,much) values(1,3);会发现商品的数量变为7了,说明在插入一条订单的时候,触发器自动做了更新操作。 

2.3、触发器对值得引用

  上述触发器有一个问题,因为在触发器中写死了num和id,所以不管买哪个商品,最终更新的都是商品1的数量。这个时候,需要将触发器中的值变为动态获取。  

对于insert来说,新插入的行用new来表示,行中的每一列的值用“new.列名”来表示:  

  新建能动态获取值的触发器: 

  create trigger tg_2 after insert on tb_orders
  for each row
  begin
  update tb_goods set num=num-new.much where id=new.id;
  end$

  删除第一个触发器:drop trigger tg_1;   插入一条订单记录:insert into tb_orders(good_id,much) values(2,3)$   执行完发现商品的数量变为7了,这样子就是合适的。

三、触发器实例

  1)创建表tab1 

  DROP TABLE IF EXISTS tab1;
  CREATE TABLE tab1(
      tab1_id varchar(11)
  );

  2)创建表tab2

  DROP TABLE IF EXISTS tab2;
  CREATE TABLE tab2(
      tab2_id varchar(11)
  );

  3)创建触发器:t_afterinsert_on_tab1 

DROP TRIGGER IF EXISTS t_afterinsert_on_tab1;
CREATE TRIGGER t_afterinsert_on_tab1 
AFTER INSERT ON tab1
FOR EACH ROW
BEGIN
     insert into tab2(tab2_id) values(new.tab1_id);
END;

  4)想tab1插入数据 

INSERT INTO tab1(tab1_id) values('0001');

  5)查看变化 

SELECT * FROM tab1;
SELECT * FROM tab2;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【SAP HANA】SAP HANA开篇(1)

          有幸当前工作能够接触到SAP S/4,能够接触到史上无敌的HANA内存数据库。HANA的技术我就不多讲了,感兴趣的人可以去百度一下。当然,有人想在本...

    SAP梦心
  • EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

    前言 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不多说,我...

    GuZhenYin
  • java中运用mybatis进行数据库操作

    目前在java项目中不论是web项目还是长连接的tcp/udp/websocket中,mytatis的使用已经越来越广,很多开发攻城狮都清楚ssh框架,这里的h...

    企鹅号小编
  • 二叉树

    二叉树基本操作代码 #include "stdafx.h" #include "stdlib.h" #include "string.h" #define M...

    静默虚空
  • 泛函编程(18)-泛函库设计-并行运算组件库

        作为专业的编程人员,我们经常会因为工作需要建立一些工具库。所谓工具库就是针对工作上经常会遇到的一些共性问题预先编制的由一整套函数所组成的函数库。通常这些...

    用户1150956
  • 数据库管理面板phpMyAdmin出现高危安全漏洞

    非常流行的数据库管理面板phpMyAdmin 目前被发现高危安全漏洞允许攻击者删除数据表甚至整个数据库。 这个高危安全漏洞是印度的安全研究人员发现的,只需伪造特...

    企鹅号小编
  • 一步步学习EF Core(2.事务与日志)

    前言 上节我们留了一个问题,为什么EF Core中,我们加载班级,数据并不会出来 其实答案很简单,~ 因为在EF Core1.1.2 中我们在EF6.0+中用到...

    GuZhenYin
  • Oracle研究专题:Oracle系统安装与配置

    最近开始研究Oracle数据库,盖因公司的系统要么Oracle要么是mysql吧。 作为一个IT工作者,没有碰过Oracle是一件很匪夷所思得事情。 想到过去几...

    SAP梦心
  • 分布式数据库数据一致性原理说明与实现

    前言 分布式数据库的数据一致性管理是其最重要的内核技术之一,也是保证分布式数据库满足数据库最基本的ACID特性中的 “一致性”(Consistency)的保障。...

    企鹅号小编
  • 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 6 章:值的不可变性

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 第 6 章:值的不可变性 在第 ...

    iKcamp

扫码关注云+社区

领取腾讯云代金券