MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由时间来触发某个操作,这些时间包括INSERT、UODATE和DELETE语句。如果定义了触发程序,当数据库执行这些语句的时候就会触发执行相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,当激活该对象。
11.1、创建触发器
触发器是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当预定义的时间发生的时候,就会被MySQL自动调用。
创建一个触发器的语法为:
1
2
<code>CREATE</code> <code>TRIGGER</code> <code>trigger_name trigger_time trigger_event</code>
<code> </code><code>ON</code> <code>tbl_name </code><code>FOR</code> <code>EACH ROW trigger_body</code>
trigger_name:触发器名称,用户自行指定
trigger_time:触发时机,可以指定为before或after
trigger_event:标识触发事件
tbl_name:标识触发器的表名
trigger_body:触发器执行语句
创建一个单执行语句的触发器:
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<code>mysql> </code><code>CREATE</code> <code>TABLE</code> <code>account (acc_num </code><code>INT</code><code>,amount </code><code>DECIMAL</code><code>(10,2));</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.06 sec)</code>
<code>mysql> </code><code>CREATE</code> <code>TRIGGER</code> <code>ins_sum BEFORE </code><code>INSERT</code> <code>ON</code> <code>account</code>
<code> </code><code>-> </code><code>FOR</code> <code>EACH ROW </code><code>SET</code> <code>@</code><code>sum</code> <code>= @</code><code>sum</code> <code>+NEW.amount;</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.02 sec)</code>
<code>mysql> </code><code>SET</code> <code>@</code><code>sum</code><code>=0;</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.00 sec)</code>
<code>mysql> </code><code>INSERT</code> <code>INTO</code> <code>account </code><code>VALUES</code> <code>(1,1.00),(2,2.00);</code>
<code>Query OK, 2 </code><code>rows</code> <code>affected (0.02 sec)</code>
<code>Records: 2 Duplicates: 0 Warnings: 0</code>
<code>mysql> </code><code>SELECT</code> <code>@</code><code>sum</code><code>;</code>
<code>+</code><code>------+</code>
<code>| @</code><code>sum</code> <code>|</code>
<code>| 3.00 |</code>
<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
创建多个执行语句的触发器的语法:
<code> </code><code>ON</code> <code>tbl_name </code><code>FOR</code> <code>EACH ROW </code>
<code> </code><code>BEGIN</code>
<code> </code><code>trigger_stmt</code>
<code> </code><code>END</code>
11.2、查看触发器
查看触发器是指查看数据库中已存在的触发器的定义、状态和触发信息等可以通过SHOW TRUGGERS和在triggers表中查看触发器信息。
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<code>mysql> </code><code>CREATE</code> <code>TABLE</code> <code>myevent</code>
<code> </code><code>-> (</code>
<code> </code><code>-> id </code><code>int</code><code>(11) </code><code>DEFAULT</code> <code>NULL</code><code>,</code>
<code> </code><code>-> evt_name </code><code>char</code><code>(20) </code><code>DEFAULT</code> <code>NULL</code>
<code> </code><code>-> );</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.03 sec)</code>
<code>mysql> </code><code>CREATE</code> <code>TRIGGER</code> <code>trig_update </code><code>AFTER</code> <code>UPDATE</code> <code>ON</code> <code>account</code>
<code> </code><code>-> </code><code>FOR</code> <code>EACH ROW </code><code>INSERT</code> <code>INTO</code> <code>myevent </code><code>VALUES</code> <code>(1,</code><code>'AFTER UPDATE'</code><code>);</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.05 sec)</code>
<code>mysql> SHOW TRIGGERS \G</code>
<code>*************************** 1. row ***************************</code>
<code> </code><code>Trigger</code><code>: ins_sum</code>
<code> </code><code>Event: </code><code>INSERT</code>
<code> </code><code>Table</code><code>: account</code>
<code> </code><code>Statement: </code><code>SET</code> <code>@</code><code>sum</code> <code>= @</code><code>sum</code> <code>+NEW.amount</code>
<code> </code><code>Timing: BEFORE</code>
<code> </code><code>Created: </code><code>NULL</code>
<code> </code><code>sql_mode: </code>
<code> </code><code>Definer: root@localhost</code>
<code>character_set_client: utf8</code>
<code>collation_connection: utf8_general_ci</code>
<code> </code><code>Database</code> <code>Collation: utf8_general_ci</code>
<code>*************************** 2. row ***************************</code>
<code> </code><code>Trigger</code><code>: trig_update</code>
<code> </code><code>Event: </code><code>UPDATE</code>
<code> </code><code>Statement: </code><code>INSERT</code> <code>INTO</code> <code>myevent </code><code>VALUES</code> <code>(1,</code><code>'AFTER UPDATE'</code><code>)</code>
<code> </code><code>Timing: </code><code>AFTER</code>
<code>2 </code><code>rows</code> <code>in</code> <code>set</code> <code>(0.00 sec)</code>
在MySQL中所有触发器的定义都存在INFORMATION_SCHEMA数据库的TRIGGERS表中,可以通过SELECT 来查看,其语法格式为:
<code>SELECT</code> <code>* </code><code>FROM</code> <code>INFORMATION_SCHEMA.TRIGGERS </code><code>WHERE</code> <code>condition;</code>
<code>mysql> </code><code>SELECT</code> <code>* </code><code>FROM</code> <code>INFORMATION_SCHEMA.TRIGGERS </code><code>WHERE</code> <code>TRIGGER_NAME=</code><code>'trig_update'</code> <code>\G</code>
<code> </code><code>TRIGGER_CATALOG: def</code>
<code> </code><code>TRIGGER_SCHEMA: test</code>
<code> </code><code>TRIGGER_NAME: trig_update</code>
<code> </code><code>EVENT_MANIPULATION: </code><code>UPDATE</code>
<code> </code><code>EVENT_OBJECT_CATALOG: def</code>
<code> </code><code>EVENT_OBJECT_SCHEMA: test</code>
<code> </code><code>EVENT_OBJECT_TABLE: account</code>
<code> </code><code>ACTION_ORDER: 0</code>
<code> </code><code>ACTION_CONDITION: </code><code>NULL</code>
<code> </code><code>ACTION_STATEMENT: </code><code>INSERT</code> <code>INTO</code> <code>myevent </code><code>VALUES</code> <code>(1,</code><code>'AFTER UPDATE'</code><code>)</code>
<code> </code><code>ACTION_ORIENTATION: ROW</code>
<code> </code><code>ACTION_TIMING: </code><code>AFTER</code>
<code>ACTION_REFERENCE_OLD_TABLE: </code><code>NULL</code>
<code>ACTION_REFERENCE_NEW_TABLE: </code><code>NULL</code>
<code> </code><code>ACTION_REFERENCE_OLD_ROW: OLD</code>
<code> </code><code>ACTION_REFERENCE_NEW_ROW: NEW</code>
<code> </code><code>CREATED: </code><code>NULL</code>
<code> </code><code>SQL_MODE: </code>
<code> </code><code>DEFINER: root@localhost</code>
<code> </code><code>CHARACTER_SET_CLIENT: utf8</code>
<code> </code><code>COLLATION_CONNECTION: utf8_general_ci</code>
<code> </code><code>DATABASE_COLLATION: utf8_general_ci</code>
11.3、触发器的使用
触发程序是与表有关的命名数据库对象,当表上出现特定时间时,将激活该对象。
创建一个在account表插入数据之后,更新myevent数据表的触发器。
<code>mysql> </code><code>CREATE</code> <code>TRIGGER</code> <code>trig_inster </code><code>AFTER</code> <code>INSERT</code> <code>ON</code> <code>account </code>
<code> </code><code>-> </code><code>FOR</code> <code>EACH ROW </code><code>INSERT</code> <code>INTO</code> <code>myevent </code><code>VALUES</code> <code>(2,</code><code>'AFTER INSERT'</code><code>); </code>
<code>Query OK, 2 </code><code>rows</code> <code>affected (0.01 sec)</code>
<code>mysql> </code><code>SELECT</code> <code>* </code><code>FROM</code> <code>myevent;</code>
<code>+</code><code>------+--------------+</code>
<code>| id | evt_name |</code>
<code>| 2 | </code><code>AFTER</code> <code>INSERT</code> <code>|</code>
11.4、删除触发器
使用DROP TRIGGER语句可以删除MySQL中已经存在的触发器,其语法格式为:
<code>DROP</code> <code>TRIGGER</code> <code>[schema_name.]trigger_name</code>
删除一个触发器
<code>mysql> </code><code>DROP</code> <code>TRIGGER</code> <code>test.ins_sum;</code>
本文转自 梦想成大牛 51CTO博客,原文链接:http://blog.51cto.com/yinsuifeng/1953884,如需转载请自行联系原作者