MySQL5:触发器
什么是触发器
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', '11', '55555555');
insert into student values(null,'Dicky', '14', '66666666');
insert into student values(null,'Coco', '19', '77777777');
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类型的触发器。灵活地运用触发器将为操作省去很多麻烦。
MySQL5:触发器的更多相关文章
- mysql5.5 对触发器,函数,存储引擎,事件进行主从复制情况.(转)
mysql5.5 对触发器,函数,存储引擎,事件进行主从复制情况. 转(http://blog.csdn.net/m582445672/article/details/7670802) 一.My ...
- 运维与开发的开车现场之MySQL5.7创建触发器报错解决过程
报错内容如下: ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds ...
- mysql5.5中datetime默认值不能为NOW或者CURRENT_TIMESTAMP,用触发器解决
mysql5.6及以上的版本datatime默认值可以为CURRENT_TIMESTAMP或者NOW 那我们要用的是mysql5.5及以下版本呢? 请看代码 delimiter // DROP TRI ...
- MySQL-5.7 创建及查看触发器
触发器的作用是当表上有对应SQL语句发生时,则触发执行. 1.语法 CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name tr ...
- Mysql5.7.21 Navicat触发器创建
CREATE TRIGGER m_trigger AFTER UPDATE ON table1 FOR EACH ROW BEGIN IF( old.status!= new.status) THEN ...
- Atitit 数据库的事件机制--触发器与定时任务attilax总结
Atitit 数据库的事件机制--触发器与定时任务attilax总结 1.1. 事件机制的图谱1 2. 触发器的类型2 3. 实现原理 After触发器 Vs Instead Of触发器2 3.1. ...
- MYSQL存储过程、游标、触发器
MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就是为以后的使用而保存的一 ...
- information_schema系列五(表,触发器,视图,存储过程和函数)
这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 1:TABLES TABLES这张表毫无疑问了,就是记录的数据库中表 ...
- MySQL 5.6 主从复制如何处理——触发器,函数,存储过程,调度事件
截图来自MySQL5.6的pdf版文档. 说明: 1)基于语句的复制时,trigger会在slave上执行,所以slave上也需要有trigger的定义,不然会导致主从数据不一致的: 2)基于行的 ...
随机推荐
- On extracting ops from LLVM backend
Symbols and ops generation: llvm::Function* BackendLLVM::build_llvm_instance (bool groupentry) Work ...
- 【洛谷4719】 动态dp(树链剖分,dp,矩阵乘法)
前言 其实我只是为了过掉模板而写的ddp,实际应用被吊着锤 Solution 并不想写详细的过程 一句话过程:将子树中轻儿子的贡献挂到这个点上面来 详细版:(引用yyb) 总结一下的话,大致的过程是这 ...
- umeng推送, 生产环境deviceToken失效可能原因
1 在系统升级之后会造成app的deviceToken重置(一定). 2 在app卸载之后可能会造成app的deviceToken重置. 3 deviceToken重置使用umeng推送时会因为dev ...
- sql语句_统计总成绩最高的前2名
有一个数据表,id user_id score 三个字段,计算总成绩最高的前两名 SELECT * FROM (SELECT user_name,SUM(score) AS score FROM us ...
- 三,PHP缓存机制实现页面静态化
页面静态化思路: 因为新闻这种信息对实时性要求不高,并且比较稳定,所以可以这样做:当地一个用户访问某条新闻后,我们使用ob缓存机制,将内容缓存到html页面.当下一次访问时候,直接访问html页面.这 ...
- 网络编程——http协议
1.TCP/IP 基本知识 一.概念 TCP/IP协议是一个协议的集合,它是由众多的互联网相关联的协议集合的总称.如图 二.TCP/IP分层管理 TCP/IP模型分为5层:应用层,传输层,网络层,数据 ...
- Sysbench0.5初体验
最近工作中需要测试数据库的OLTP的性能,参考了下MariaDB的benchmark中的测试脚本,发现脚本中已经使用了Sysbench-0.5,可以在这里https://launchpad.net/s ...
- javaweb+spring 项目集成异常的处理
在web项目开发中,一个系统应该要考虑到异常情况的处理,并且应该当异常发生时应该需要记录相应的异常日志,对于用户而言则不能直接抛出异常,需要考虑到用户的体验: 以下就介绍基于spring框架的基础上的 ...
- 【GDKOI2016】 魔卡少女 线段树
题目大意:给你一个长度为n的序列${a_1....a_n}$,有$m$次操作 每次操作有两种情况:修改$a_i$的值,询问$[l,r]$中所有子区间的异或和. 数据范围:$n,m≤10^5$,$a_i ...
- C++ 定时器Timer在项目中的使用
目录 1.情况说明 2.空循环实现 3.定时器实现 1.情况说明 由于最近要在项目里做弹出弹幕,要求是弹出1秒后消失,一开始我使用空循环进行计时,发现执行到这段代码CPU占用率上升十几个百分点,后来改 ...