转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46763665

触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不须要使用CALL

也不须要手工启动。仅仅要当一个提前定义的事件发生的时候,就会被MYSQL自己主动调用。


创建触发器

语法例如以下:

CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt

触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。

不能将触发程序与暂时表表或视图关联起来。

trigger_time是触发程序的动作时间。它能够是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

trigger_event指明了激活触发程序的语句的类型。

trigger_event能够是下述值之中的一个:

·         INSERT:将新行插入表时激活触发程序,比如。通过INSERT、LOAD DATA和REPLACE语句。

·         UPDATE:更改某一行时激活触发程序。比如,通过UPDATE语句。

·         DELETE:从表中删除某一行时激活触发程序,比如,通过DELETE和REPLACE语句。

请注意,trigger_event与以表操作方式激活触发程序的SQL语句并不非常类似,这点非常重要。

比如,关于INSERT的BEFORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。

可能会造成混淆的样例之中的一个是INSERT INTO .. ON DUPLICATE UPDATE ...语法:BEFORE INSERT触发程序对于每一行将激活,后跟AFTER INSERT触发程序。或BEFORE UPDATE和AFTER UPDATE触发程序,详细情况取决于行上是否有反复键。

对于具有同样触发程序动作时间和事件的给定表,不能有两个触发程序。

比如,对于某一表,不能有两个BEFORE UPDATE触发程序。

但能够有1个BEFORE UPDATE触发程序和1个BEFORE INSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTER UPDATE触发程序。

trigger_stmt是当触发程序激活时运行的语句。

假设你打算运行多个语句。可使用BEGIN ... END复合语句结构。这样,就能使用存储子程序中同意的同样语句。

创建一个单运行语句的触发器

CREATE TABLE account(acct_num INT ,amount DECIMAL(10,2));
CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @SUM=@SUM+new.amount;

首先创建一个account表,表中有两个字段,分别为:acct_num字段(定义为int类型)

amount字段(定义成浮点类型);其次创建一个名为ins_sum的触发器,触发的条件是向数据表account插入数据之前。

对新插入的amount字段值进行求和计算

DECLARE @num INT
SET @num=0
INSERT INTO account VALUES(1,1.00),(2,2.00)
SELECT @num

首先创建一个account表,在向表account插入数据之前。计算全部新插入的account表的amount值之和。

触发器的名称为ins_num。条件是在向表插入数据之前触发。

创建有多个运行语句的触发器,语法例如以下:

DELIMITER |

CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END
|

查看触发器

查看触发器是指数据库中已存在的触发器的定义、状态、语法信息等。

能够使用SHOW TRIGGERS 和在TRIGGERS 表中查看触发器信息

SHOW TRIGGERS
Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation
------- ------ ------- ------------------------ ------ ------- -------- -------------- -------------------- -------------------- ------------------
ins_sum INSERT account set @sum=@sum+new.amount BEFORE (NULL) root@localhost utf8 utf8_general_ci utf8_general_ci EVENT表示激活触发器的事件,这里的触发事件为插入操作INSERT。TABLE表示激活触发器的对象表,这里为account 表

Timing表示触发器的时间,为插入之前(BEFORE)。Statement 表示触发器运行的操作,另一些其它信息。比方SQL模式。触发器的定义帐户和字符集等

在TRIGGERS 表中查看触发器信息

information_schema数据库的TRIGGERS 表中,能够通过查询查看触发器信息

SELECT * FROM `information_schema`.`TRIGGERS` WHERE `TRIGGER_NAME`='ins_sum'

TRIGGER_CATALOG  TRIGGER_SCHEMA  TRIGGER_NAME  EVENT_MANIPULATION  EVENT_OBJECT_CATALOG  EVENT_OBJECT_SCHEMA  EVENT_OBJECT_TABLE  ACTION_ORDER  ACTION_CONDITION  ACTION_STATEMENT          ACTION_ORIENTATION  ACTION_TIMING  ACTION_REFERENCE_OLD_TABLE  ACTION_REFERENCE_NEW_TABLE  ACTION_REFERENCE_OLD_ROW  ACTION_REFERENCE_NEW_ROW  CREATED  SQL_MODE  DEFINER         CHARACTER_SET_CLIENT  COLLATION_CONNECTION  DATABASE_COLLATION
--------------- -------------- ------------ ------------------ -------------------- ------------------- ------------------ ------------ ---------------- ------------------------ ------------------ ------------- -------------------------- -------------------------- ------------------------ ------------------------ ------- -------- -------------- -------------------- -------------------- ------------------
def school ins_sum INSERT def school account 0 (NULL) set @sum=@sum+new.amount ROW BEFORE (NULL) (NULL) OLD NEW (NULL) root@localhost utf8 utf8_general_ci utf8_general_ci

TRIGGER_SCHEMA 表示触发器所在的数据库

TRIGGER_NAME表示触发器的名称

EVENT_OBJECT_TABLE表示在哪个表上触发

ACTION_STATEMENT 表示触发器触发的时候运行的详细操作

ACTION_ORIENTATION是ROW。表示在每条记录上都触发

ACTION_TIMING表示触发的时刻是BEFORE


删除触发器

使用DROP TRIGGER 语句能够删除MYSQL中已经定义的触发器,删除触发器的基本的语法

DROP TRIGGER [schema_name.]trigger_name

当中(schema_name)是可选的

假设省略了schema(方案)。将从当前方案中舍弃触发程序。

删除ins_sum触发器

DROP TRIGGER `school`.`ins_sum`

触发器ins_sum删除成功


总结

对于同样的表,同样的事件仅仅能创建一个触发器,比方对表account创建了BEFORE INSERT触发器

那么假设对表account再次创建一个BEFORE INSERT触发器,MYSQL就会报错,此时,仅仅能够在表account上

创建AFTER INSERT或者BEFORE UPDATE类型的触发器

补充:

CREATE TABLE account(acct_num INT ,amount DECIMAL(10,2),NUM INT );

CREATE TRIGGER ins_sum BEFORE INSERT
ON account FOR EACH ROW
UPDATE
`employee`
SET
`Age` = new.acct_num + 1
WHERE `ID` = new.acct_num ; INSERT INTO account(acct_num,amount) VALUES(1,2.00); SELECT * FROM `employee`

MySQL优化之——触发器的更多相关文章

  1. Mysql优化系列(2)--通用化操作梳理

    前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...

  2. 单表60亿记录等大数据场景的MySQL优化和运维之道

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  3. 【转】单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  4. [转载] 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209406532&idx=1&sn=2e9b0cc02bdd ...

  5. MYSQL 优化指南

    数据库设计原则   标准化和规范化 数据库设计范式(3NF)   第一范式 数据属性唯一标示 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关 ...

  6. mysql优化sql语句的方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  7. 「mysql优化专题」90%程序员没听过的存储过程和存储函数教学(7)

    一.MYSQL储存过程简介(技术文): 储存过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时 ...

  8. Mysql优化方面的知识

    Mysql优化方面的知识 第一方面:30种mysql优化sql语句查询的方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避 ...

  9. mysql优化之SQL语句优化

    Mysql优化是一个老生常谈的问题, 优化的方向也优化很多:从架构层;从设计层;从存储层;从SQL语句层; 今天讲解一下从SQL语句层: 这个部分是程序员最容易把控的地方,也是最容易忽视的地方. 一个 ...

随机推荐

  1. 【LeetCode】Unique Email Addresses(独特的电子邮件地址)

    这道题是LeetCode里的第929道题. 题目要求: 每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔. 例如,在 alice@leetcode.com中, alice 是本地名称,而  ...

  2. Method for Estimating the Number of Concurrent Users

    1. Formula for Estimating the Average Number of Concurrent users We begin by defining what the numbe ...

  3. hdu6073[dfs+删边] 2017多校4

    题目中对二分图的定义十分特殊, 指的是 U,V两部分中,U的顶点度数必定为2,V中顶点无限制. 题目要求的是 对于所有匹配,该匹配的权值=该匹配中选中的边的边权的乘积,求所有匹配权值之和. 对于V中的 ...

  4. 刷题总结——瞭望塔(bzoj1038)

    题目: Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线 ...

  5. Android开发把项目打包成apk-(转)

    做完一个Android项目之后,如何才能把项目发布到Internet上供别人使用呢?我们需要将自己的程序打包成Android安装包文件--APK(Android Package),其后缀名为" ...

  6. go初识

    for循环 ; i < ; i++ { fmt.Println(i*i) } ls := "agd" for _, arg := range ls{ fmt.Println( ...

  7. 洛谷——P2733 家的范围 Home on the Range

    P2733 家的范围 Home on the Range 题目背景 农民约翰在一片边长是N (2 <= N <= 250)英里的正方形牧场上放牧他的奶牛.(因为一些原因,他的奶牛只在正方形 ...

  8. ubuntu 命令行模式和图形界面切换

    1.按ALT+CTRL+F1切换到字符界面(Linux实体机) 如果是VMware虚拟机安装的Linux系统,则切换到字符界面的时候需要以下操作 按下ALT+CTRL+SPACE(空格),ALT+CT ...

  9. disruptor 核心链路应用场景

    核心链路一般比较复杂并且需要考虑:服务之间相互依赖性.流程能够走完.人员的变动等情况 要考虑:兜底.补偿. 常见解决方案是:1)完全解耦 2)模板模式 其他解决方案:1)有限状态机框架:spring- ...

  10. Java中Arrays类与Math类

    Arrays(数组工具类) Java中已经封装好的类,提供大量静态方法供用户对数组的使用. 导包:import java.util.Arrays 1.Arrays.toString(数组) //返回值 ...