触发器(TRIGGER)是由事件来触发某个操作。这些事件包括INSERT语句、UPDATE语句和DELETE语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。MySQL从5.0.2版本开始支持触发器。在本文中将讲解的内容包括:

触发器的含义和作用

如何创建触发器

如何查看触发器

如何删除触发器

触发器是由INSERT、UPDATE和DELETE等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。例如,当学生表中增加了一个学生的信息时,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录,就执行一次计算学生总数的操作。这样就可以保证每次增加学生的记录后,学生总数是与记录数是一致的。触发器触发的执行语句可能只有一个,也可能有多个。本节将详细讲解创建触发器的方法。

一、语法

创建只有一个执行语句的触发器

MySQL中,创建只有一个执行语句的触发器的基本形式如下:

  1. CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件
  2. ON 表名 FOR EACH ROW 执行语句

创建有多个执行语句的触发器

MySQL中,触发器触发的执行语句可能有多个。创建有多个执行语句的触发器的基本形式如下:

  1. CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件
  2. ON 表名 FOR EACH ROW
  3. BEGIN
  4. 执行语句列表
  5. END

下面来具体说说语法

1、命名规则

  1. CREATE TRIGGER <触发器名称> <--
  2. { BEFORE | AFTER }
  3. { INSERT | UPDATE | DELETE }
  4. ON <表名称>
  5. FOR EACH ROW
  6. BEGIN
  7. <触发器SQL语句>
  8. END

触发器必须有名字,最多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同时使用。

三、使用范例

先创建两个表、一个订单表,一个订单时间表

  1. CREATE TABLE T_ORDER(
  2. ORDER_NUM INT PRIMARY KEY,
  3. ORDER_NAME CHAR(10) NOT NULL
  4. );
  5. CREATE TABLE T_ORDER_TIME(
  6. ORDER_NUM INT PRIMARY KEY,
  7. ORDER_TIME TIMESTAMP NOT NULL,
  8. )

1、创建插入时的触发器

  1. CREATE TRIGGER TRI_INSERT
  2. AFTER INSERT ON T_ORDER FOR EACH ROW
  3. BEGIN
  4. INSERT INTO learning.t_order_time(ORDER_NUM,ORDER_TIME) VALUES(NEW.ORDER_NUM,NOW());
  5. END

然后订单表中插入一条数据

  1. INSERT INTO T_ORDER(ORDER_NUM,ORDER_NAME) VALUES(1,'电脑');
  2. SELECT * FROM t_order;
  3. SELECT * FROM t_order_time;

这是订单表中插入的数据:

这是订单时间表中自动插入的数据:

2、更新时插入数据

  1. //更新创建触发器
  2. CREATE TRIGGER TRI_UPDATA
  3. BEFORE UPDATE ON T_ORDER FOR EACH ROW
  4. BEGIN
  5. UPDATE  learning.t_order_time SET ORDER_TIME=NOW() WHERE OLD.ORDER_NUM=ORDER_NUM;
  6. END
  7. UPDATE T_ORDER  SET ORDER_NAME='饼干饼' WHERE ORDER_NUM=1;
  8. SELECT * FROM t_order;
  9. SELECT * FROM t_order_time;

可以看到,时间已经更新

3、创建删除触发器

[java] view
plain
copy

  1. //创建删除触发器
  2. CREATE TRIGGER TRI_DELETE
  3. AFTER DELETE ON T_ORDER FOR EACH ROW
  4. BEGIN
  5. DELETE FROM  learning.t_order_time  WHERE OLD.ORDER_NUM=ORDER_NUM;
  6. END
  7. DELETE FROM  learning.t_order  WHERE ORDER_NUM=1;
  8. SELECT * FROM t_order;
  9. 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、删除触发器

  1. DROP TRIGGER 触发器名

6、触发器 与存储过程

触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL

(允许存储程序通过参数将数据返回触发程序)。 

而存储过程 可以接受参数,将结果范围给应用程序

Mysql学习总结(10)——MySql触发器使用讲解的更多相关文章

  1. mysql学习3:mysql之my.cnf详解

    mysql之my.cnf详解 本文转自:https://www.cnblogs.com/panwenbin-logs/p/8360703.html 以下是 my.cnf 配置文件参数解释: #*** ...

  2. 吴裕雄--天生自然MySQL学习笔记:MySQL 运算符

    要介绍 MySQL 的运算符及运算符的优先级. MySQL 主要有以下几种运算符: 算术运算符 比较运算符 逻辑运算符 位运算符 算术运算符 MySQL 支持的算术运算符包括: 在除法运算和模运算中, ...

  3. 吴裕雄--天生自然MySQL学习笔记:MySQL 处理重复数据

    有些 MySQL 数据表中可能存在重复的记录,有些情况允许重复数据的存在,但有时候我们也需要删除这些重复的数据. 防止表中出现重复数据 可以在 MySQL 数据表中设置指定的字段为 PRIMARY K ...

  4. 吴裕雄--天生自然MySQL学习笔记:MySQL GROUP BY 语句

    GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT column_name, funct ...

  5. mysql学习教程之mysql管理

    MySQL 管理 启动及关闭 MySQL 服务器 Windows 系统下 在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录. 启动: cd c:/mysq ...

  6. 吴裕雄--天生自然MySQL学习笔记:MySQL 安装

    所有平台的 MySQL 下载地址为: MySQL 下载:https://dev.mysql.com/downloads/mysql/ 注意:安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足 ...

  7. 吴裕雄--天生自然MySQL学习笔记:MySQL 导入数据

    1.mysql 命令导入 使用 mysql 命令导入语法格式为: mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql) 实例: # mysql -uroot -p12 ...

  8. 吴裕雄--天生自然MySQL学习笔记:MySQL 临时表

    MySQL 临时表在我们需要保存一些临时数据时是非常有用的.临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间. MySQL临时表只在当前连接可见,如果使用PHP脚本来创建My ...

  9. 吴裕雄--天生自然MySQL学习笔记:MySQL 事务

    MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成 ...

  10. 吴裕雄--天生自然MySQL学习笔记:MySQL UNION 操作符

    MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中.多个 SELECT 语句会删除重复的数据. 语法 MySQL UNION 操作符语法格式: SELECT ...

随机推荐

  1. SVN版本号管理工具使用中常见的代码提交冲突问题的解决方法

    相信刚開始学习使用SVN的小伙伴在项目合作开发的过程中一定常常遇到一些影响到自己编写的代码的苦恼.我这里列举了几种常见的问题以及问题的解决方法: 1.误删除和误操作的问题 问题1:有A和B两个人一块合 ...

  2. Conditionals

    1. Modulus operator (%) The modulus operator works on integers and yields the remainder when the fir ...

  3. Windows安装PHP MongoDB扩展

    本文将讲述一下在Wamp环境下安装MongoDB扩展的过程,大家可以略作参考 Linux 版本的可以参考之前发布的Linux安装PHP MongoDB扩展 安装环境 系统环境:Windows 7 64 ...

  4. Hadoop框架基础(五)

    ** Hadoop框架基础(五) 已经部署了Hadoop的完全分布式集群,我们知道NameNode节点的正常运行对于整个HDFS系统来说非常重要,如果NameNode宕掉了,那么整个HDFS就要整段垮 ...

  5. ListView 适配器实现getviewtypcount() 数组越界IndexOutOfBoundException

    ListView中Item的多布局显示,需要用到了getViewTypecount和getItemViewType这两个重写方法,但是做完后出现了如下提示错误:java.lang.ArrayIndex ...

  6. java 8 , merge()

    import java.util.HashMap; import java.util.Map; public class j8merge { public static void main(Strin ...

  7. 日常基础—————echo,print,print_r,var_dump的区别

    1.echo   函数输出一个或多个字符串. 代码: header("Content-Type:text/html; charset=utf-8"); echo "你好” ...

  8. Hadoop集群配置搭建

    环境:Centos 6.9,Hadoop 2.7.1,JDK 1.8.0_161,Maven 3.3.9 前言: 1.配置一台master服务器,两台或多台slave服务器.    2.master可 ...

  9. linux驱动编译时候出现的问题

    1.在编译驱动的时候,提示错误,找不到<asm/xxxx.h>这些类的头文件? 答:因为在内核编译的时候,会在内核目录的include中创建一个asm文件再软链接到对应的一些架构.比如我当 ...

  10. HDU 4941 Magical Forest (Hash)

    这个题比赛的时候是乱搞的,比赛结束之后学长说是映射+hash才恍然大悟.因此决定好好学一下hash. 题意: M*N的格子,里面有一些格子里面有一个值. 有三种操作: 1.交换两行的值. 2.交换两列 ...