第十章《触发器》

第十章《触发器》

触发器(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)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101968.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 主机、宿主机_宿主机架

    主机、宿主机_宿主机架主机:包括机箱、主板、CPU、内存、硬盘、显卡等,总之就是机箱及和内部的所有东西的总称。虚拟机中的概念是这样的:1、宿主机:指要安装虚拟机软件的计算机,你花钱买的物理机。2、虚拟机:利用虚拟机工具构造出来的,有一整套硬件设备,有自己操作系统,应用软件。3、宿主操作系统:物理机上安装的,例如在一台Win2K机上安装VMWare4、客户操作系统:虚拟机上的操作系统,如RedHatLinu

    2022年8月21日
    14
  • javabean总结

    javabean总结

    2021年12月3日
    57
  • 渗透测试神器Nessus使用教程「建议收藏」

    渗透测试神器Nessus使用教程「建议收藏」简介:

    2022年10月19日
    4
  • ue4封装接口_ue4导出模型

    ue4封装接口_ue4导出模型原创文章,转载请注明出处。本文带大家认识UE4插件/模块的使用方式Dll。既然为DLL,那么我们就可以对其封装,做到不公开cpp的目的。1>新建一个Plugin2>在plugin中创建一个Actor类,并在里面写一个UE4的Log输出函数。3>对其进行编译,编译出不同模式的dll出来4>在UE4场景中测试我们Log函数5>删除cpp文件6>在我们的.build.cs中添加不参数编译的参数bUsePrecompiled=true;7>再到UE4场景中测试我们L

    2022年9月1日
    8
  • 程序员,在北上广深杭赚够100万,就逃回二三四线城市生活,靠谱吗?

    程序员,在北上广深杭赚够100万,就逃回二三四线城市生活,靠谱吗?无意间刷到一个话题,北漂程序员,赚够100万,然后回三四线城市享受生活,不确定这个想法靠不靠谱。讲真,我觉得我在这个话题上还是挺有话语权的。就来给大家唠唠,看能不能提供一丢丢参考价值。我没有在北京搬砖过,但在苏州搬砖过,苏州和北上广深杭比起来,肯定有差距,但不得不承认,苏州的发展速度确实是有目共睹的。目前已经在三线城市洛阳生活了多年,生活品质不能说有多高,但生活的基础条件我觉得都还过得去。尤其是其中很重要的一点,教育资源是能跟得上的。01、十分怀念那苏州说实话,还是挺怀念苏州那段时光的。苏州不

    2022年7月26日
    6
  • c# 进度条的使用(例子)[通俗易懂]

    c# 进度条的使用(例子)[通俗易懂]2012-05-2320:21在用c#做WinFrom开发的过程中。我们经常需要用到进度条(ProgressBar)用于显示进度信息。这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息)。下面我就简单结合一个我写的例子给大家做一个介绍。首先看一下程序界面第一步:设计界面不说了…注意需要引用usingSyst

    2025年6月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号