什么是触发器

MySQL的触发器(trigger)和存储过程一样,都是嵌入到MySQL中的一段程序。触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE和DELETE语句。如果定义了触发程序,当数据库执行这些语句的时候就会激发触发器执行相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

创建触发器

触发器是个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句调用,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MySQL自动调用。比如对student表进行操作(INSERT、DELETE或UPDATE)时就会激活它执行。

触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于满足复杂的业务规则或要求。可以创建只有一条语句的触发器,不过一般都是有多个执行语句的触发器用得比较多,即使单条语句的触发器,也可以使用多条语句的触发器的写法来写,看下有多个执行语句的触发器的基本写法:

CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt

解释一下:

1、trigger_name标识触发器名称,用户自行指定

2、trigger_time标识触发时机,可以指定为before或after

3、trigger_event标识触发事件,包括INSERT、UPDATE和DELETE

4、tbl_name标识建立触发器的表名,即在哪张表上建立触发器

5、trigger_stmt是触发器程序体,触发器程序可以使用begin和end作为开始和结束,中间包含多条语句

触发器程序可以使用begin和end作为开始和结束,中间包含多条语句。举个例子,还是以前的学生表:

create table student
(
studentId int primary key auto_increment not null,
studentName varchar(10) not null,
studentAge int,
studentPhone varchar(15)
)

给学生表的studentName、studentAge、studentPhone三个字段都创建一个触发器表:

create table triggerstudentname
(
t_studentName VARCHAR(10)
); create table triggerstudentAge
(
t_studentAge int
); create table triggerstudentPhone
(
t_studentPhone VARCHAR(15)
);

创建一个触发器,每次插入一条数据之后分别往三张表插字段:

CREATE TRIGGER trigger_student AFTER INSERT ON student
FOR EACH ROW
BEGIN
INSERT INTO triggerstudentname values(NEW.studentName);
INSERT INTO triggerstudentAge values(NEW.studentAge);
INSERT INTO triggerstudentPhone values(NEW.studentPhone);
END

插入三条数据:

insert into student values(null,'Jack', '', '');
insert into student values(null,'Dicky', '', '');
insert into student values(null,'Coco', '', '');
commit;

看一下三张表的情况:

没什么问题,执行结果显示,在向student表插入数据的同时,triggerstudentname、triggerstudentAge和triggerstudentPhone三张表里面的数据都发生了裱花,INSERT动作触发了触发器。

查看触发器

查看触发器是指查看数据库中已存在的触发器的定义、状态和语法信息等。可以通过命令来查看已经创建的触发器,有两种方式可以查看触发器,一一讲解。

1、SHOW TRIGGERS语句查看触发器

通过SHOW TRIGGERS查看触发器的语句如下:

SHOW TRIGGERS;

用这个命令来查看一下触发器:

有一部分没截取完整,解释一下主要部分的含义:

(1)Trigger表示触发器的名称,这里有两个触发器分别是tri_student和trigger_student

(2)Event表示激活触发器的事件,这里的两个触发事件为插入操作INSERT

(3)Table表示激活触发器的操作对象表,这里都为student表

(4)Statement表示激活触发器之后执行的语句

(5)Timing表示触发器触发的时间,分别为插入操作之前(BEFORE)和插入操作之后(AFTER)

2、在triggers表中查看触发器信息

SHOW TRIGGERS语句查看当前创建的所有触发器信息,这在触发器较少的情况下,使用该语句会很方便,如果要查看特定的触发器信息,可以直接从infomation_schema数据库中的triggers表中查找,通过SELECT命令查看,基本语法为:

SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE condition;

比如:

SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = 'trigger_student';

可以自己查看一下命令运行的效果

删除触发器

使用DROP TRIGGER语句可以删除MySQL中已经定义的触发器,删除触发器的基本语法为:

DROP TRIGGER [schema_name.]trigger_name;

schema_name表示数据库名称,是可选的,如果省略了schema_name,将从当前数据库中删除触发器,trigger_name是要删除的触发器的名称,比如:

DROP TRIGGER school.tri_student

触发器tri_student删除成功

使用触发器的注意点

在使用触发器的时候需要注意:对于相同的表,相同的事件只能创建一个触发器

比如对表student创建了一个BEFORE INSERT触发器,那么如果对表student再次创建一个BEFORE INSERT触发器,MySQL将会报错,此时,只可以在表student上创建AFTER INSERT或者BEFORE UPDATE类型的触发器。灵活地运用触发器将为操作省去很多麻烦。

MySQL6:触发器的更多相关文章

  1. pt-online-schema-change中update触发器的bug

    pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G . ...

  2. MySQL主从环境下存储过程,函数,触发器,事件的复制情况

    下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...

  3. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  4. MSSQL 事务,视图,索引,存储过程,触发器

    事务 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.这特别适用于多用户同时操作的数据 ...

  5. Mysql - 触发器/视图

    触发器在之前的项目中, 应用的着实不多, 没有办法的时候, 才会去用这个. 因为这个东西在后期并不怎么好维护, 也容易造成紊乱. 我最近的项目中, 由于数据库设计(别人设计的)原因, 导致一些最简单功 ...

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

    一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...

  7. 我的MYSQL学习心得(十二) 触发器

    我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...

  8. Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等

    功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...

  9. MySQL触发器-条件触发器语法

    文章为作者原创,未经许可,禁止转载.    -Sun Yat-sen University 冯兴伟 实验4 触发器 )实验目的 掌握数据库触发器的设计和使用方法 )实验内容和要求 定义BEFORE触发 ...

随机推荐

  1. REDIS源码中一些值得学习的技术细节02

    Redis中散列函数的实现: Redis针对整数key和字符串key,采用了不同的散列函数 对于整数key,redis使用了 Thomas Wang的 32 bit Mix Function,实现了d ...

  2. 多层嵌套ajax同步

    方式一: $.ajax({ type : "post", url : "user/add", data : data, async : false, //必须为 ...

  3. Android中如何收听特定应用安装成功的广播

    一.manifest的配置 <receiver android:name=".AppReceiver"> <intent-filter> <actio ...

  4. 读取全球ip获取用户地区

    这个 首先说明下.ip库是qq纯真ip库 dat文件类型 public static string QQipPath = AppDomain.CurrentDomain.BaseDirectory + ...

  5. 1293. 3n+1数链问题 2016 12 23

    /* 1293. 3n+1数链问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description 在计算机科学上,有很多类问题是无法解 ...

  6. JavaScript常用函数之Eval()使用

    eval() 功能:首先解释Javascript代码  然后执行它 用法:Eval(codeString) codeString是包含有javascript语句的字符串,在eval之后使用Javasc ...

  7. ES6详解

    1.ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. const声明常亮,不可改变 2.变量的解构赋值 (1)数组的解构赋值: 以前,为 ...

  8. 16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

    ;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.as ...

  9. JavaScript-BOM-history:保存当前窗口打开后成功访问过的url历史记录栈

    history:保存当前窗口打开后成功访问过的url历史记录栈history.go(n):前进n步前进一步:history.go(1);后退一步:history.go(-1);刷新:history.g ...

  10. SQL Server简洁查询正在运行的进程SQL

    通常我们可以使用 sp_who2 我们希望更加简洁的信息,下面这个查询使用系统表sys.sysprocesses,以及sys.dm_exec_sql_text做OUTER APPLY. T-SQL是这 ...