学习笔记之MySQL触发器详解

木木老贼 互联网营销达人~

触发器是由事件来触发某个操作,这些事件包括INSERT语句,UPDATE语句和DELETE语句.

创建触发器:创建只有一个执行语句的触发器.

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件,ON 表名 FOR EACH ROW 执行语句其中,触发器名参数指要创建的触发器的名字.

1、创建MySQL触发器:

语法:代码如下:

  1. CREATETRIGGERtrigger_nametrigger_timetrigger_eventONtbl_name
  2. FOREACHROW
  3. BEGIN
  4. trigger_stmt
  5. END
  6. CREATETRIGGERtrigger_nametrigger_timetrigger_eventONtbl_name
  7. FOREACHROW
  8. BEGIN
  9. trigger_stmt
  10. END

例子,代码如下:

  1. CREATETRIGGERSetUserHomeafterinsertONusers
  2. FOREACHROW
  3. BEGIN
  4. update`users`sethomeLocationX=128,
  5. homeLocationY=128,homeLocationZ=30
  6. --phpfensi.com
  7. whereuuid=NEW.uuid
  8. END

以上的例子是错误的,让本表进行触发时进行更新会让程序进入死循环,系统会报这样的错误:it is already used by statement which invoked this stored function/trigger.

应该改成以下语句:

  1. CREATETRIGGERSetUserHomebeforeinsertONusers
  2. FOREACHROW
  3. BEGIN
  4. setNew.homeLocationX=128;
  5. setNew.homeLocationY=128;
  6. setNew.homeLocationZ=30;
  7. END

BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后,FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器,代码如下:

  1. mysql>CREATETRIGGERtrig1AFTERINSERT
  2. ->ONworkFOREACHROW
  3. ->INSERTINTOtimeVALUES(NOW());

Query OK, 0 rows affected (0.09 sec)上面创建了一个名为trig1的触发器,一旦在work中有插入动作,就会自动往time表里插入当前时间.

创建有多个执行语句的触发器

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件

ON 表名 FOR EACH ROW

BEGIN

执行语句列表

END其中,BEGIN与END之间的执行语句列表参数表示需要执行的多个语句,不同语句用分号隔开.

tips:一般情况下,mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突,为解决此问题可用DELIMITER,如:DELIMITER ||,可以将结束符号变成||,当触发器创建完成后,可以用DELIMITER ;来将结束符号变成;代码如下:

  1. mysql>DELIMITER||
  2. mysql>CREATETRIGGERtrig2BEFOREDELETE
  3. ->ONworkFOREACHROW
  4. ->BEGIN
  5. ->INSERTINTOtimeVALUES(NOW());
  6. ->INSERTINTOtimeVALUES(NOW());
  7. ->END
  8. ->||
  9. QueryOK,0rowsaffected(0.06sec)

mysql> DELIMITER ;上面的语句中,开头将结束符号定义为||,中间定义一个触发器,一旦有满足条件的删除操作,就会执行BEGIN和END中的语句,接着使用||结束,最后使用DELIMITER ; 将结束符号还原.

查看触发器:

SHOW TRIGGERS语句查看触发器信息,代码如下:

  1. mysql>SHOWTRIGGERSG;
  2. ***************************1.row***************************
  3. Trigger:trig1
  4. Event:INSERT
  5. Table:work
  6. Statement:INSERTINTOtimeVALUES(NOW())
  7. Timing:AFTER
  8. Created:NULL
  9. sql_mode:
  10. Definer:root@localhost
  11. character_set_client:utf8
  12. collation_connection:utf8_general_ci

Database Collation: latin1_swedish_ci结果会显示所有触发器的基本信息

tips:SHOW TRIGGERS语句无法查询指定的触发器

在triggers表中查看触发器信息,代码如下:

  1. mysql>SELECT*FROMinformation_schema.triggersG
  2. ***************************1.row***************************
  3. TRIGGER_CATALOG:def--phpfensi.com
  4. TRIGGER_SCHEMA:person
  5. TRIGGER_NAME:trig1
  6. EVENT_MANIPULATION:INSERT
  7. EVENT_OBJECT_CATALOG:def
  8. EVENT_OBJECT_SCHEMA:person
  9. EVENT_OBJECT_TABLE:work
  10. ACTION_ORDER:0
  11. ACTION_CONDITION:NULL
  12. ACTION_STATEMENT:INSERTINTOtimeVALUES(NOW())

结果显示了所有触发器的详细信息,同时,该方法可以查询制定触发器的详细信息,代码如下:

  1. mysql>SELECT*FROMinformation_schema.triggersWHERETRIGGER_NAME='trig1'G
  2. ***************************1.row***************************
  3. TRIGGER_CATALOG:def
  4. TRIGGER_SCHEMA:person
  5. TRIGGER_NAME:trig1
  6. EVENT_MANIPULATION:INSERT
  7. EVENT_OBJECT_CATALOG:def
  8. EVENT_OBJECT_SCHEMA:person
  9. EVENT_OBJECT_TABLE:worktips

所有触发器信息都存储在information_schema数据库下的triggers表中,可以使用SELECT语句查询,如果触发器信息过多,最好通过TRIGGER_NAME字段指定查询.

删除触发器

mysql> DROP TRIGGER trig1;

Query OK, 0 rows affected (0.04 sec)删除触发器之后最好使用上面的方法查看一遍.同时,也可以使用database.trig来指定某个数据库中的触发器

tips:如果不需要某个触发器时一定要将这个触发器删除,以免造成意外操作.

相关广告
  • 学习笔记之MySQL触发器详解 学习笔记之MySQL触发器详解 学习笔记之MySQL触发器详解
相关阅读

mysql触发器trigger操作memcache实例

2019/10/10 17:38:00 | 谷歌SEO算法 | SEO教程

学习笔记之MySQL触发器详解

2019/10/10 17:34:14 | 谷歌SEO算法 | 黑猫SEO