十一、MySQL触发器

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

  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,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL
Mysql基础第二十八天,使用触发器
Mysql基础第二十八天,使用触发器
28 0
Mysql基础第二十八天,使用触发器
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】10、MySQL 的触发器
【MySQL 数据库】10、MySQL 的触发器
20 0
|
2月前
|
SQL 存储 关系型数据库
MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理
MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理
34 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL触发器 使用案例
MySQL触发器 使用案例
29 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL之如何使用触发器
MySQL之如何使用触发器
40 1
|
4月前
|
SQL 关系型数据库 MySQL
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
37 0
|
4月前
|
SQL 关系型数据库 MySQL
My Sql 触发器
My Sql 触发器
|
11天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)
|
1月前
|
关系型数据库 MySQL 数据库连接
关于MySQL-ODBC的zip包安装方法
关于MySQL-ODBC的zip包安装方法
|
30天前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
82 1