触发器的作用是当表上有对应SQL语句发生时,则触发执行。

1.语法

CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body trigger_time: { BEFORE | AFTER } trigger_event: { INSERT | UPDATE | DELETE } trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

说明:

  • trigger_name:触发器的名称,不能与已经存在的触发器重复;
  • trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发;
  • trigger_event::{ INSERT |UPDATE | DELETE },触发该触发器的具体事件;
  • tbl_name:该触发器作用在tbl_name上;

2.关键说明

  • Definer关键词用来指定trigger的安全环境;
  • trigger_time指定触发器的执行时间,BEFORE和AFTER指定触发器在表中的每行数据修改前或者后执行;
  • trigger_event指定触发该触发器的集体事件:

    INSERT 当新的一行数据插入表中时触发,如执行insert,load data,replace语句插入新数据

    UPDATE 当表的一行数据被修改时触发,如执行update语句时

    DELETE 当表的一行数据被删除时触发,如执行delete,replace语句时
  • 当执行insert into...on duplicate key update语句时,当碰到重复行执行update时,则触发update下的触发器;
  • 从5.7.2版本开始,可以创建具有相同trigger_time和trigger_event的同一个表上的多个触发器,默认情况下,按照创建时间依次执行,通过指定FOLLOWS/PRECEDES改变执行顺序,即FOLLOWS时表示新创建的触发器执行,PRECEDES则表示新触发器先执行;
  • trigger_body 表示触发器触发之后要执行的一个或多个语句,在内部可以引用涉及表的字段,OLD.col_name表示行数据被修改或删除之前的字段数据,NEW.col_name表示数据被插入或修改之后的字段数据;

3.实例

mysql> delimiter //
mysql> create trigger simple_trigger
-> after update
-> on students for each row
-> begin
-> insert into students_bak values(old.sid,old.sname,new.sname,old.gender,new.gender,now());
-> end//
Query OK, 0 rows affected (0.16 sec) mysql> select * from students;
+-----+--------+--------+---------+
| sid | sname | gender | dept_id |
+-----+--------+--------+---------+
| 1 | Andrew | -1 | 1 |
| 2 | Andy | -1 | 1 |
| 3 | Bob | -1 | 1 |
| 4 | Ruth | -1 | 2 |
| 5 | Mike | -1 | 2 |
| 6 | John | 0 | 3 |
| 7 | Cindy | 1 | 3 |
| 8 | Susan | 1 | 3 |
+-----+--------+--------+---------+
8 rows in set (0.01 sec) mysql> update students set sname='abc',gender=1 where sid=1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from students;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
| 1 | abc | 1 | 1 |
| 2 | Andy | -1 | 1 |
| 3 | Bob | -1 | 1 |
| 4 | Ruth | -1 | 2 |
| 5 | Mike | -1 | 2 |
| 6 | John | 0 | 3 |
| 7 | Cindy | 1 | 3 |
| 8 | Susan | 1 | 3 |
+-----+-------+--------+---------+
8 rows in set (0.00 sec) mysql> select * from students_bak;
+--------+----------+----------+-----------+-----------+---------------------+
| oldsid | oldsname | newsname | oldgender | newgender | tstamp |
+--------+----------+----------+-----------+-----------+---------------------+
| 1 | Andrew | abc | -1 | 1 | 2017-12-13 11:04:52 |
+--------+----------+----------+-----------+-----------+---------------------+
1 row in set (0.00 sec)

4.查看触发器(information_schema)

mysql> select TRIGGER_SCHEMA,TRIGGER_NAME,DEFINER,ACTION_STATEMENT from TRIGGERS where TRIGGER_SCHEMA='course';
+----------------+----------------+----------------+-----------------------------------------------------------------------------------------------------+
| TRIGGER_SCHEMA | TRIGGER_NAME | DEFINER | ACTION_STATEMENT |
+----------------+----------------+----------------+-----------------------------------------------------------------------------------------------------+
| course | simple_trigger | root@localhost | begin
insert into students_bak values(old.sid,old.sname,new.sname,old.gender,new.gender,now());
end |
+----------------+----------------+----------------+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

5.删除触发器

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
  • if exists用来避免删除不存在的触发器时引发的报错
  • 当你执行drop table时,表上的触发器也被drop掉了
mysql> drop trigger simple_trigger;
Query OK, 0 rows affected (0.00 sec)

MySQL-5.7 创建及查看触发器的更多相关文章

  1. MySQL索引的创建,查看,删除

    在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引. 1.ALTER TABLE ALTER TABLE用来创建普通索引.UN ...

  2. mysql表的创建、查看、修改、删除

    一.创建表 创建表前先使用use 数据库名进入某一个数据库,创建表语句的格式如下: create table 表名称 ( 列名1 列的数据类型 [约束], 列名2 列的数据类型 [约束], 列名2 列 ...

  3. MySQL索引的创建、删除和查看

    MySQL索引的创建.删除和查看 此文转自http://blogold.chinaunix.net/u3/93470/showart_2001536.html 1.索引作用 在索引列上,除了上面提到的 ...

  4. 【第四章】MySQL数据库的基本操作:数据库、表的创建插入查看

    MySQL数据库基本操作 创建表 create table 查看表结构 desc table, show create table 表完整性约束 修改表 alter table 复制表 create ...

  5. 索引-mysql索引创建、查看、删除及使用示例

    mysql索引创建.查看.删除及使用示例 1.创建索引: ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引. ALTER TABLE table_name ADD ...

  6. 利用navicat创建存储过程、触发器和使用游标的简单实例

    利用navicat创建存储过程.触发器和使用游标的简单实例 标签: navicat存储过程触发器mysql游标 2013-08-03 21:34 15516人阅读 评论(1) 收藏 举报  分类: 数 ...

  7. 【转】MYSQL入门学习之十一:触发器的基本操作

    转载地址:http://www.2cto.com/database/201212/176781.html 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句 ...

  8. mysql基础三(视图、触发器、函数、存储过程、事务、防注入)

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 1.创建视图 -格式:CREATE ...

  9. MySQL基础之第9章 触发器

    触发器(TRIGGER)是由事件来触发某个操作.这些事件包括INSERT语句.UPDATE语句和DELETE语句.当数据库系统执行这些事件时,就会激活触发器执行相应的操作.MySQL从5.0.2版本开 ...

随机推荐

  1. 多线程之使用读写锁ReentrantReadWriteLock实现缓存系统

    简单地缓存系统:当有线程来取数据时.假设该数据存在我的内存中.我就返回数据.假设不存在我的缓存系统中,那么就去查数据库.返回数据的同一时候保存在我的缓存中. 当中涉及到读写问题:当多个线程运行读操作时 ...

  2. MATLAB中的文件类型总结

    %   ***.m文件 : 脚本文件或者函数文件或者:%   ***.mat文件:数据存储文件(二进制文件,可以ASCII码形式保存和加载,%                类似于单行EXCEL表格) ...

  3. bootstrap基础学习九篇

    现在学学bootstrap响应式实用工具 Bootstrap 提供了一些辅助类,以便更快地实现对移动设备友好的开发.这些可以通过媒体查询结合大型.小型和中型设备,实现内容对设备的显示和隐藏. 需要谨慎 ...

  4. 【python】pyqt练习

    import sys from PyQt4.QtCore import * from PyQt4.QtGui import * import ui_price class PriceDlg(QDial ...

  5. 如何用MathType编辑这三个符号

    MathType是一款专门的公式编辑器,用来编辑数学物理等公式,很多期刊杂志的排版都会用到它.用MathType编辑公式的时候,完全不用考虑学习和上手的过程,打开就可以编辑出你的公式,所以这个工具对于 ...

  6. [Linux 学习] Centos 使用yum出现Loaded plugins: refresh-packagekit, security

    sudo vim  /etc/yum/pluginconf.d/fastestmirror.conf enabled=0  //把1改为0 verbose=0 socket_timeout=3 hos ...

  7. SurvivalShooter学习笔记(六.玩家生命)

    需求: 玩家有初始生命: 被敌人攻击后:掉血,播放受击音效,红屏(用UI图片做)闪烁提示,UI面板刷新生命 直至死亡:死亡播放死亡音效,游戏结束: 1.变量: 玩家生命 public int star ...

  8. 性能测试:压测中TPS上不去的几种原因分析(就是思路要说清楚)

    转https://www.cnblogs.com/imyalost/p/8309468.html 先来解释下什么叫TPS: TPS(Transaction Per Second):每秒事务数,指服务器 ...

  9. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.3——使用Robotium进行功能测试

    问题: 你想要使用Robotium库测试activity. 解决方案: 增加Robotium依赖,编写自己的测试脚本. 讨论: Android Test Support Library提供类可以操作a ...

  10. mysql 获取id最大值

    数据库表中id列不为自动增加,需要程序来增加id的SQL SELECTCASE IFNULL(MAX(id),1)WHEN 1 THEN 1ELSE MAX(id) + 1END AS newmaxi ...