第十章《触发器》

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 第十章《触发器》

触发器(trigger)是一个特殊的存储过程,都是嵌入到mysql的一段程序,触发器是由事件来出发某个操作,触发器涉及到sql语句是DML(insert、update、delete)。触发器触发的操作里面可以是单条sql语句也可以是多条sql语句的集合,不需要手动启动,只要当一个预定义事件发生,就会被mysql自动调用执行预先定义好的操作。
注意:尽量少用触发器,因为触发器执行速度比较慢,如果滥用触发器,会严重影响sql语句执行的效率。

简单理解:你执行一条sql语句,这条sql语句的执行会自动触发执行其他的sql语句

创建触发器的四个要素:
(1)监视地点:(table)
(2)监视事件:(insert、update、delete)
(3)触发时间:(before/after)
(4)触发事件:(insert、update、delete)

创建触发器的语法:
create trigger 触发器名 触发时间(before/after) 触发事件(insert、update、delete)
on 表名 for each row 要执行的SQL语句(单个SQL语句/begin 多个SQL语句 end);

delimiter 定界符号;分隔符号
其实就是告诉MySQL解释器,该段命令是否已经结束了,mysql是否可以执行了。

单条:

mysql> create table log1(log varchar(255) not null);
Query OK, 0 rows affected (0.01 sec)

mysql> create table time(sql_time timestamp);
Query OK, 0 rows affected (0.00 sec)

mysql> create trigger log_time before insert on log1mysql> create trigger log_time befues(now());
Query OK, 0 rows affected (0.02 sec)

mysql> insert into log1 values('create table test3');
Query OK, 1 row affected (0.00 sec)

mysql> select * from time;
+---------------------+
| sql_time            |
+---------------------+
| 2020-04-02 09:19:54 |
+---------------------+
1 row in set (0.00 sec)

mysql> insert into log1 values('create table test4');
Query OK, 1 row affected (0.01 sec)

mysql> select * from time;
+---------------------+
| sql_time            |
+---------------------+
| 2020-04-02 09:19:54 |
| 2020-04-02 09:20:57 |
+---------------------+
2 rows in set (0.00 sec)

多条:

mysql> create table test1(a1 int);
Query OK, 0 rows affected (0.04 sec)

mysql> create table test2(a1 int);
Query OK, 0 rows affected (0.01 sec)

mysql> drop tables test2;
Query OK, 0 rows affected (0.01 sec)

mysql> create table test2(a2 int);
Query OK, 0 rows affected (0.02 sec)

mysql> create table test3(a3 int auto_increment primary key);
Query OK, 0 rows affected (0.00 sec)

mysql> create table test4(a4 int not null auto_increment primary key,b4 int default 0); 
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter //
mysql> create trigger test_ref after insert on test1 for each row begin insert into test2 set a2=new.a1;
    -> delete from test3 where a3=new.a1;
    -> update test4 set b4=b4+1 where a4=new.a1;
    -> end//
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> CREATE TABLE test1(a1 INT);
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE test2(a2 INT);
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE test3(a3 INT AUTO_INCREMENT PRIMARY KEY);
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE test4(a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,b4 INT DEFAULT 0);
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER //
mysql> CREATE TRIGGER test_ref AFTER INSERT ON test1 FOR EACH ROW 
    -> BEGIN
    -> INSERT INTO test2 SET a2=NEW.a1;
    -> DELETE FROM test3 WHERE a3=NEW.a1;
    -> UPDATE test4 SET b4=b4+1 WHERE a4=NEW.a1;
    -> END//
mysql> DELIMITER ;
给test3和4插入基础数据:
mysql> INSERT INTO test3 VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
Query OK, 10 rows affected (0.01 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test3;
+----+
| a3 |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
+----+
10 rows in set (0.00 sec)



mysql> INSERT INTO test4(a4) VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0);
Query OK, 10 rows affected (0.01 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test4;
+----+------+
| a4 | b4   |
+----+------+
|  1 |    0 |
|  2 |    0 |
|  3 |    0 |
|  4 |    0 |
|  5 |    0 |
|  6 |    0 |
|  7 |    0 |
|  8 |    0 |
|  9 |    0 |
| 10 |    0 |
+----+------+
10 rows in set (0.00 sec)
给test1插入数据触发触发器:
mysql> INSERT INTO test1 VALUES(1),(3),(1),(4),(7),(8),(8),(5),(4);
Query OK, 9 rows affected (0.01 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test2;
+------+
| a2   |
+------+
|    1 |
|    3 |
|    1 |
|    4 |
|    7 |
|    8 |
|    8 |
|    5 |
|    4 |
+------+
9 rows in set (0.00 sec)

mysql> SELECT * FROM test3;
+----+
| a3 |
+----+
|  2 |
|  6 |
|  9 |
| 10 |
+----+
4 rows in set (0.00 sec)

mysql> SELECT * FROM test4;
+----+------+
| a4 | b4   |
+----+------+
|  1 |    2 |
|  2 |    0 |
|  3 |    1 |
|  4 |    2 |
|  5 |    1 |
|  6 |    0 |
|  7 |    1 |
|  8 |    2 |
|  9 |    0 |
| 10 |    0 |
+----+------+
10 rows in set (0.00 sec)

NEW和OLD解释:
mysql中定义了new和old,用来表示触发器的所在表中,触发了触发器的哪一行数据,来引用触发器中发生变化的记录内容,具体的:
(1)在insert型触发器中,new用来表示将要(before)或者已经(after)插入的新数据;
(2)在update型触发器中,OLD用来表示将要或已经被修改的原数据,NEW用来表示将要或已经修改完成的新数据;
(3)在delete型触发器中,OLD用来表示将要或已经被删除的原数据
使用方法:
NEW.字段名 OLD.字段名

查看触发器
1.SHOW TRIGGERS\G
2.触发器的信息记录在information_schema.triggers 这个表里。我们select这个表就可以了

删除触发器:
DROP TRIGGER 触发器名称


mysql> CREATE TABLE orders (o_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
g_id INT NOT NULL DEFAULT 0,num INT NOT NULL DEFAULT 0);
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE goods(id INT AUTO_INCREMENT PRIMARY KEY,goods_name VARCHAR(30) NOT NULL,goods_num INT NOT NULL DEFAULT 0);
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO goods(goods_name,goods_num) VALUES('手机',100),('电 脑',20),
('洗发水',300),('书',30);

mysql> CREATE TRIGGER kucun AFTER INSERT ON orders FOR EACH ROW UPDATE 
goods SET goods_num=goods_num-NEW.num WHERE id=NEW.g_id;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO orders(g_id,num) VALUES(1,2),(3,100),(4,5);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM orders;
+------+------+-----+
| o_id | g_id | num |
+------+------+-----+
|    1 |    1 |   2 |
|    2 |    3 | 100 |
|    3 |    4 |   5 |
+------+------+-----+
3 rows in set (0.00 sec)

mysql> SELECT * FROM goods;
+----+------------+-----------+
| id | goods_name | goods_num |
+----+------------+-----------+
|  1 | 手机       |        98 |
|  2 | 电脑       |        20 |
|  3 | 洗发水     |       200 |
|  4 | 书         |        25 |
+----+------------+-----------+
4 rows in set (0.00 sec)
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 存储 安全
触发器简介
触发器是一个在修改指定表中的数据时执行的存储过程。经常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性或一致性,由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以此确保数据的完整性。
106 0
|
存储 SQL 数据库
【机房重构】——存储过程和触发器
【机房重构】——存储过程和触发器
148 0
【机房重构】——存储过程和触发器
|
SQL 存储 程序员
【机房重构】——触发器
【机房重构】——触发器
83 0
|
存储
触发器基础知识(上)
在数字电路中,需要具有记忆和存储功能的逻辑部件,触发器就是组成这类逻辑部件的基本单元。触发器都具备一下特点:
826 0
触发器基础知识(上)
|
芯片
触发器基础知识(中)
JK触发器是在同步RS触发器的基础上引入两条反馈线构成的。
599 0
触发器基础知识(中)
|
芯片
触发器基础知识(下)
D触发器只有一个输入端,消除了输出的不定状态。D触发器具有置0、置1的逻辑功能,如图所示:
394 0
触发器基础知识(下)
|
SQL 数据库
SQL基础【十九、触发器】(不建议使用触发器的原因)
SQL基础【十九、触发器】(不建议使用触发器的原因)
762 0
SQL基础【十九、触发器】(不建议使用触发器的原因)
|
JavaScript Android开发
第二十三章:触发器和行为(十二)
淡化和定向在本书中,您已经看到了几个颜色选择程序,可以通过使用三个Slider元素以交互方式形成颜色。 本章的最后一个示例是另一个颜色选择程序,但是这个程序为您提供了选项:它包含三个标记为“RGB Hex”,“RGB Float”和“HSL”的单选按钮(实际上是简单的Label元素)。
696 0
|
JavaScript Android开发
第二十三章:触发器和行为(七)
行为 触发器和行为通常是串联讨论的,因为它们具有一些应用重叠。 有时候你会感到困惑是否使用触发器或行为,因为似乎要么这样做工作。你可以用触发器做任何事情,你也可以做一个行为。 但是,行为总是涉及一些代码,这是一个派生自Behavior 的类。
934 0
|
JavaScript Android开发
第二十三章:触发器和行为(十一)
单选按钮内置于旧汽车仪表板中的无线电通常具有一排六个(左右)按钮,可以为各种无线电台“编程”。 按下其中一个按钮会导致无线电跳转到该预选电台,并且还会弹出前一个选择按钮。那些旧的汽车收音机现在是古董,但我们的电脑屏幕上的互斥选项仍然由我们称为单选按钮的视觉对象表示。
898 0