• MySQL-Trigger

    背景:

    触发器,顾名思义。也就是在发生某个行为时,会触发一系列过程。 其实,触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。在具体应用中,之所以会经常使用触发器数据库对象,是由于该对象能够加强数据库表中数据的完整性约束和业务规则等。那么问题来了:

    触发者是谁?

    触发什么动作?

    怎样触发,如何创建和删除触发?  ……..

    内容:

    触发器的限制:

    1. 在MySQL中,一张表相同触发程序动作时间和事件,不能有两个触发程序。

    例如,对于某一表,不能有两个BEFORE UPDATE触发程序。但可以有1个BEFORE UPDATE触发程序和1个BEFORE INSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTER UPDATE触发程序。也就是说,在一个表上最多建立6个触发器。

    2. 触发者对象不能是临时表或视图,必须是物理表。

    3.  触发事件只能是 INSERT 、UPDATE、DELETE

    4.  账号必须具备创建trigger的权限,可以通过show grants来查看。

    创建触发器:

    yy

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

    trigger_event指明了激活触发程序的语句的类型,可以是下述值之一:

    • INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
    • UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
    • DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。

    trigger_body是我们的一系列触发器动作。这一部分的语法和procedure的语法都是通用的

    创建语法:

    一.  begin 与 end :

    BEGIN

    [statement_list]

    END

    statement_list 代表一个或多个语句的列表,列表内的每条语句都必须用分号( ;) 来结尾。而在MySQL中,分号是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL可以开始执行了。因此,解释器遇到statement_list 中的分号后就开始执行,然后会报出错误,因为没有找到和 BEGIN 匹配的 END。

    这时就会用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思),它是一条命令,不需要语句结束标识,语法为:

    DELIMITER new_delemiter

    new_delemiter 可以设为1个或多个长度的符号,默认的是分号(;),我们可以把它修改为其他符号,比如 $符号,DELIMITER $在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了$,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来

    二. DECLARE :

    MySQL 中使用 DECLARE 来定义局部变量,该变量只能在 BEGIN … END 复合语句中使用,并且应该定义在复合语句的开头,即其它语句之前,语法如下:

    DECLARE var_name[,…] type [DEFAULT value]

    其中:var_name 为变量名称,同 SQL 语句一样,变量名不区分大小写;type 为 MySQL 支持的任何数据类型;可以同时定义多个同类型的变量,用逗号隔开;变量初始值为 NULL,如果需要,可以使用 DEFAULT 子句提供默认值,值可以被指定为一个表达式。

    对变量赋值采用 SET 语句,语法为:

    SET var_name = expr [,var_name = expr] …

    三. NEW 与 OLD 

    NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据

    —— INSERT : NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据,没有OLD;

    —— UPDATE :OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;

    —— DELETE : OLD 用来表示将 要或已经被删除的原数据,没有NEW;

    使用方法: NEW.columnName (columnName 为相应数据表某一列名)

    查看触发器:

    方式一: 和查看数据库(show databases;)查看表格(show tables;)一样,查看触发器的语法如下:

    SHOW TRIGGERS [FROM schema_name];

    其中,schema_name 即 Schema 的名称,在 MySQL 中 Schema 和 Database 是一样的,也就是说,可以指定数据库名,这样就不必先“USE database_name;”了。

    方式二: 从INFORMATION_SCHEMA.TRIGGER里面查看到:

    yy

    删除触发器:

    和删除数据库、删除表格一样,删除触发器的语法如下:

    DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

    导出触发器:

    当我们想用mysqldump导出一个数据库上存在的触发器时–triggers 同时导出触发器。该选项默认启用,用 –skip-triggers 禁用它。

    创建实例: 

    可参考官方文档http://dev.mysql.com/doc/refman/5.6/en/trigger-syntax.html

    致谢:

    有部分内容参考自:http://www.jb51.net/article/59552.htm