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

一、触发器概述

 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(),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',),('商品2',),('商品3',);

  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()
  );

  2)创建表tab2

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

  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('');

  5)查看变化 

SELECT * FROM tab1;
SELECT * FROM tab2;

MySQL(十一)之触发器的更多相关文章

  1. mysql 查询表,视图,触发器,函数,存储过程

    1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TAB ...

  2. MySQL的学习--触发器

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...

  3. mysql存储过程和触发器的应用

    ***********[mysql 存储过程和触发器 -- 别安驹]********************* 1.什么情况下使用存储过程? 完成一些比较麻烦的逻辑,比如多表在mysql端的cpu很空 ...

  4. Mysql高级之触发器

    原文:Mysql高级之触发器 触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete). 看以下事件: 完 ...

  5. mysql查看所有触发器以及存储过程等操作集合

    今天在做每个月定时扣费的功能 用到了Mysql的Event Scheduler 昨完之后发现一个问题 Event Scheduler 默认是不开启的 要在mysql内执行SET GLOBAL even ...

  6. 【转】MySQL的学习--触发器

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...

  7. mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数

    mysql:视图.触发器.事务.存储过程.函数 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果 ...

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

    一.触发器 触发器(TRIGGER):是由事件来触发某个操作.当数据库系统执行这些事件时,就会激活触发器执行相应的操作.MySQL从5.0.2版本开始支持触发器. 触发事件:INSERT语句.UPDA ...

  9. mysql 查看删除触发器等操作

    mysql 查看删除触发器等操作 平时很少操作触发器,源于昨晚的一次故障,使用pt-online-change-schema修改大表过程中出现异常,再次执行时,提示已经存在触发器,导致失败. 这里推荐 ...

  10. mysql用户创建触发器权限不足跟参数log_bin_trust_function_creators

    问题描述 有业务反馈当前用户无法创建触发器和存储过程,让用户自己测试,该用户进行对表的增删改查等其他权限没有问题,这边用root用户查证,该用户拥有对当前库的所有权限,但是为什么就是创建不了触发器呢? ...

随机推荐

  1. drbd.9.0版本部署

    DRBD9.0部署 1) drbd软件安装 软件:drbd-9.0.0.tar.gz . drbd-utils-8.9.5.tar.gz(从8.4.5开始,drbd软件分成了两部分:核心模块和管理工具 ...

  2. 闭包(Closure)基础分析

    闭包(Closure) 本文聚焦于回答2个问题: 在全局作用域中,如何读取函数内部的局部变量? 在全局作用域中,如何修改函数内部的局部变量? 变量作用域 JavaScript语言的作用域,一句话概括就 ...

  3. Java基础之接口与抽象类及多态、内部类

    final关键字 被其修饰的类,不能被继承. 被其修饰的方法,不能被覆盖. 被其修饰的变量,是一个常量,不能被修改,所以定义时必须初始化(和C++的const类似). 一般有final,会搭配stat ...

  4. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之二

    好了,废话也不多说,咱们直接来看看这款MVC的造型——你可能会大吼:“这……这特么的都是些什么鬼?” 靠,告诉你吧,我也不知道这都是些什么鬼,反正以前我是没有见过这样的MVC.咦,老纸的config文 ...

  5. 双向循环链表(C语言描述)(一)

    双向循环链表是链表的一种,它的每个节点也包含数据域和指针域.为了方便程序维护,可以单独为数据域定义一种数据类型,这里以整型为例: typedef int LinkedListData; 双向循环链表( ...

  6. Java常用文件操作-2

    上篇文章记录了常用的文件操作,这里记录下通过SSH服务器操作Linux服务器的指定路径下的文件. 这里用到了第三方jar包 jsch-0.1.53.jar, jsch-api 1.删除服务器上指定路径 ...

  7. Jmeter==HTTP信息头管理器的作用

    HTTP信息头管理器在Jmeter的使用过程中起着很重要的作用,通常我们在通过Jmeter向服务器发送http请求(get或者post)的时候,往往后端需要一些验证信息,比如说web服务器需要带过去c ...

  8. sns社交系统ThinkSNS+ 更新至V0.8.2,新增圈子功能

    sns社交系统"ThinkSNS+"于7月15日发布了V0.8.0,含开源版本web+H5,及Android APP和iOS APP客户端. V0.8.2版本将于7月29日(本周六 ...

  9. Oracle联机日志损坏解决办法

    关于此问题,在网上找到一篇不错的文章. 大家都清楚,联机日志分为当前联机日志和非当前联机日志. ---------------------------------------------------- ...

  10. 关于Uncaught SyntaxError: Unexpected token o in JSON at position 1,chrome持续报错的相关解析

    今天跟大家分享我前两天遇见的一个BUG,说出来很难受,因为这个BUG花了我一个多小时去找原因,后来莫名其妙的故障消失了,强迫症犯了的我,居然花了2个多小时去故意再制造这个BUG,只想弄明白WHY??? ...