开发者社区> 技术小阿哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

十一、MySQL触发器

简介:
+关注继续查看

  MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由时间来触发某个操作,这些时间包括INSERT、UODATE和DELETE语句。如果定义了触发程序,当数据库执行这些语句的时候就会触发执行相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,当激活该对象。


11.1、创建触发器

 触发器是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当预定义的时间发生的时候,就会被MySQL自动调用。

 创建一个触发器的语法为:

1
2
CREATE TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_body

trigger_name:触发器名称,用户自行指定

trigger_time:触发时机,可以指定为before或after 

trigger_event:标识触发事件

tbl_name:标识触发器的表名

trigger_body:触发器执行语句

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> CREATE TABLE account (acc_num INT,amount DECIMAL(10,2));
Query OK, 0 rows affected (0.06 sec)
 
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
    -> FOR EACH ROW SET @sum = @sum +NEW.amount;
Query OK, 0 rows affected (0.02 sec)
 
mysql> SET @sum=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> INSERT INTO account VALUES (1,1.00),(2,2.00);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
mysql> SELECT @sum;
+------+
| @sum |
+------+
| 3.00 |
+------+
1 row in set (0.00 sec)


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

1
2
3
4
5
CREATE TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW 
    BEGIN
      trigger_stmt
    END


11.2、查看触发器

 查看触发器是指查看数据库中已存在的触发器的定义、状态和触发信息等可以通过SHOW TRUGGERS和在triggers表中查看触发器信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
mysql> CREATE TABLE myevent
    -> (
    -> id int(11) DEFAULT NULL,
    -> evt_name char(20) DEFAULT NULL
    -> );
Query OK, 0 rows affected (0.03 sec)
 
mysql> CREATE TRIGGER trig_update AFTER UPDATE ON account
    -> FOR EACH ROW INSERT INTO myevent VALUES (1,'AFTER UPDATE');
Query OK, 0 rows affected (0.05 sec)
 
mysql> SHOW TRIGGERS \G
*************************** 1. row ***************************
             Trigger: ins_sum
               Event: INSERT
               Table: account
           Statement: SET @sum = @sum +NEW.amount
              Timing: BEFORE
             Created: NULL
            sql_mode: 
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
*************************** 2. row ***************************
             Trigger: trig_update
               Event: UPDATE
               Table: account
           Statement: INSERT INTO myevent VALUES (1,'AFTER UPDATE')
              Timing: AFTER
             Created: NULL
            sql_mode: 
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
rows in set (0.00 sec)


  在MySQL中所有触发器的定义都存在INFORMATION_SCHEMA数据库的TRIGGERS表中,可以通过SELECT 来查看,其语法格式为:

1
SELECT FROM INFORMATION_SCHEMA.TRIGGERS WHERE condition;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> SELECT FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME='trig_update' \G
*************************** 1. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: test
              TRIGGER_NAME: trig_update
        EVENT_MANIPULATION: UPDATE
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: test
        EVENT_OBJECT_TABLE: account
              ACTION_ORDER: 0
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: INSERT INTO myevent VALUES (1,'AFTER UPDATE')
        ACTION_ORIENTATION: ROW
             ACTION_TIMING: AFTER
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: OLD
  ACTION_REFERENCE_NEW_ROW: NEW
                   CREATED: NULL
                  SQL_MODE: 
                   DEFINER: root@localhost
      CHARACTER_SET_CLIENT: utf8
      COLLATION_CONNECTION: utf8_general_ci
        DATABASE_COLLATION: utf8_general_ci
1 row in set (0.00 sec)


11.3、触发器的使用

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

创建一个在account表插入数据之后,更新myevent数据表的触发器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> CREATE TRIGGER trig_inster AFTER INSERT ON account 
    -> FOR EACH ROW INSERT INTO myevent VALUES (2,'AFTER INSERT'); 
Query OK, 0 rows affected (0.02 sec)
 
mysql> INSERT INTO account VALUES (1,1.00),(2,2.00);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
mysql> SELECT FROM myevent;
+------+--------------+
| id   | evt_name     |
+------+--------------+
|    2 | AFTER INSERT |
|    2 | AFTER INSERT |
+------+--------------+
rows in set (0.00 sec)


11.4、删除触发器

  使用DROP TRIGGER语句可以删除MySQL中已经存在的触发器,其语法格式为:

1
DROP TRIGGER [schema_name.]trigger_name

删除一个触发器

1
2
mysql> DROP TRIGGER test.ins_sum;
Query OK, 0 rows affected (0.02 sec)


本文转自 梦想成大牛 51CTO博客,原文链接:http://blog.51cto.com/yinsuifeng/1953884,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
13688
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载