[关闭]
@Cesar 2016-03-23T02:16:21.000000Z 字数 1251 阅读 1372

MySql触发器

sql

触发器简介

MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时(如增删查改),将调用该对象,即表的操作事件触发表上的触发器的执行。

基本格式

  1. CREATE TRIGGER trigger_name
  2. trigger_time
  3. trigger_event ON tbl_name
  4. FOR EACH ROW
  5. trigger_stmt
  1. trigger_name
    标识触发器名称,用户自行指定
  2. trigger_time
    标识触发器执行时机,取值为Before和After
  3. trigger_event
    标识触发事件,取值为INSERT、UPDATE、DELETE
  4. tbl_name
    标识触发器的表名,即在哪张表上建立触发器,在该张表进行trigger_event操作的时候,触发触发事件
  5. trigger_stmt
    触发器程序体,可以是一句sql语句,或者用begin和end包含的多条语句

关键字详解

  1. BEGIN … END
    在MySQL中,BEGIN … END语句的语法为:

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

    1. DECLARE var_name[,...] type [DEFAULT value]

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

    1. SET var_name = expr [,var_name = expr]

    其中:

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

    • 在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
    • 在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
    • 在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;

    • 使用方法: NEW.columnName (columnName为相应数据表某一列名)另外,OLD 是只读的,而NEW则可以在触发器中使用 SET赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2013”)。

    • 注:
      在Mysql中,update与insert触发器是不可以在语句中继续使用update的,官方的说法是为了防止死循环。解决的方法是直接在new里面对需要改动变量进行赋值

例子

  1. DROP TRIGGER IF EXISTS test.`Hello`;
  2. DELIMITER $$
  3. CREATE TRIGGER `test`.`Hello` BEFORE UPDATE
  4. ON `test`.`order` FOR EACH ROW
  5. BEGIN
  6. SET new.update_time=NOW();
  7. END $$
  8. DELIMITER;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注