1、触发器

MySQL中的触发器概念,和Java中的事件监听器有点相似。当你想要某条语句在某个事件发生时自动执行,就要用到触发器了。

触发器能响应如下三类语句:
  • DELETE
  • INSERT
  • UPDATE

但是,在MySQL的触发器中,不支持CALL语句,这意味着不能从触发器内部调用存储过程。只能将所需的存储过程代码复制到触发器内进行使用。

1.1 创建触发器

创建触发器 CREATE TRIGGER :
  • 唯一的触发器名称
  • 应该响应的活动(DELETE、INSERT或UPDATE)
  • 触发器关联的表
  • 触发事件(处理之前还是之后)

e.g.
CREATE TRIGGER newproduct AFTER INSERT ON products
FOR EACH ROW SELECT 'Product added';
2
 
1
CREATE TRIGGER newproduct AFTER INSERT ON products 
2
FOR EACH ROW SELECT 'Product added';
以上,表示对标products中每个插入行,都执行 SELECT 'Product added'

触发器按每个表每个事件每次定义,且每次仅允许定义一个触发器。因此,每个表最多支持6个触发器(每条INSERT、UPDATE、DELETE的AFTER和BEFORE),单一触发器不能与多个事件或者表关联,所以,假如你需要一个对INSERT和UPDATE操作执行的触发器,则应该定义两个触发器。

1.2 删除触发器:

删除触发器 DROP TRIGGER :
e.g.
DROP TRIGGER newproduct;
1
 
1
DROP TRIGGER newproduct;

1.3 使用触发器

1.3.1 INSERT触发器

在INSERT触发器代码内,可以引用名为NEW的虚拟表,访问被插入的行,且该表在BEFORE INSERT触发器中,其表内的值允许更改。

e.g.
CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW SELECT NEW.order_num;
2
 
1
CREATE TRIGGER neworder AFTER INSERT ON orders
2
FOR EACH ROW SELECT NEW.order_num;

在插入一个新订单到orders表时,MySQL生成新订单号并保存到order_num中,触发器则从NEW.order_num取得这个值(对于orders的每次插入使用这个触发器将总是返回新的订单号):
--输入
INSERT INTO orders(order_date, cust_id) VALUES(Now(), 10001); --输出
+---------+
|order_num|
+---------+
| 20010 |
+---------+
x
 
1
--输入
2
INSERT INTO orders(order_date, cust_id) VALUES(Now(), 10001);
3

4
--输出
5
+---------+
6
|order_num|
7
+---------+
8
|  20010  |
9
+---------+

1.3.2 DELETE触发器

在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,该表可以访问被删除的行,但是该表中的值都是只读的,不能修改:

e.g. 使用OLD保存将要被删除的行道另一个存档表中
CREATE TRIGGER deleteorder BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
INSERT INTO archive_orders(order_num, order_date, cust_id)
VALUE(OLD.order_num, OLD.order_date, OLD.cust_id);
END:
6
 
1
CREATE TRIGGER deleteorder BEFORE DELETE ON orders
2
FOR EACH ROW
3
BEGIN
4
  INSERT INTO archive_orders(order_num, order_date, cust_id)
5
  VALUE(OLD.order_num, OLD.order_date, OLD.cust_id);
6
END:

1.3.3 UPDATE触发器

在UPDATE触发器的代码中,通过虚拟表OLD访问更新前的值,通过虚拟表NEW访问要更新的值:

e.g. 数据净化
CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors
FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);
 
1
CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors
2
FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);


《MySQL必知必会》[06] 触发器的更多相关文章

  1. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

  2. MySQL使用和操作总结(《MySQL必知必会》读书笔记)

    简介 MySQL是一种DBMS,即它是一种数据库软件.DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类是基于客户机——服务器的DBMS.前者用于桌面用途,通常不用于高端或更关键应用. My ...

  3. mysql 必知必会总结

    以前 mysql 用的不是很多, 2 天看了一遍 mysql 必知必会又复习了一下基础.  200 页的书,很快就能看完, 大部分知识比较基础, 但还是了解了一些以前不知道的知识点.自己做一个备份,随 ...

  4. 读《MySql必知必会》笔记

    MySql必知必会 2017-12-21 意义:记录个人不注意的,或不明确的,或不知道的细节方法技巧,此书250页 登陆: mysql -u root-p -h myserver -P 9999 SH ...

  5. MySql必知必会内容导图

    <MySQL必知必会>从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用.子查询.正则表达式和基于全文本的搜索.存储过程.游标.触发器.表约束,等等.通过重点突出的章节,条理 ...

  6. 读《MySQL必知必会》我学到了什么?

    前言 最近在写项目的时候发现自己的SQL基本功有些薄弱,遂上知乎查询MYSQL关键字,期望得到某些高赞答案的指点,于是乎发现了 https://www.zhihu.com/question/34840 ...

  7. 《MySQL必知必会》学习笔记——前言

    前言 MySQL已经成为世界上最受欢迎的数据库管理系统之一.无论是用在小型开发项目上,还是用来构建那些声名显赫的网站,MySQL都证明了自己是个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的 ...

  8. MySQL必知必会(第4版)整理笔记

    参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...

  9. 【MySQL 基础】MySQL必知必会

    MySQL必知必会 简介 <MySQL必知必会>的学习笔记和总结. 书籍链接 了解SQL 数据库基础 什么是数据库 数据库(database):保存有组织的数据的容器(通常是一个文 件或一 ...

  10. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

随机推荐

  1. VUE路由转场特效,WebAPP的前进与后退

    一.效果图 二.思路 1. 定义两个 CSS 过度动画,前进与后退: slide-right-enter   和   slide-left-enter 2. 给路由配置meta信息,设置各个路由的级别 ...

  2. 洗礼灵魂,修炼python(31)--面向对象编程(1)—面向对象,对象,类的了解

    面向对象 1.什么是面向对象 (图片来自网络) 哈哈,当然不是图中的意思. 1).面向对象(Object Oriented,OO)是软件开发方法.利用各大搜索引擎得到的解释都太官方,完全看不懂啥意思对 ...

  3. 洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

    是的,我是想到什么知识点就说什么,没有固定的主题,我的标题都是在写完博客再给的.本篇博文说说列表进阶话题.其实列表应该是比较熟悉的了,而毫不夸张的说,在实际的开发中,列表也是使用的最多的,以后你会体会 ...

  4. 根据id来大量删除数据between

    id的范围来删除数据 比如要删除 110到220的id信息:delete id from 表名 where id between 110 and 220;

  5. MySQL5.7 GTID学习笔记,[MySQL 5.6] GTID实现、运维变化及存在的bug

      GTID(global transaction identifier)是对于一个已提交事务的全局唯一编号,前一部分是server_uuid,后面一部分是执行事务的唯一标志,通常是自增的. 下表整理 ...

  6. 反射的作用—>实现框架的功能

    框架与框架要解决的核心问题 我们做房子卖给用户住,用于用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中.框架与工具类有区别,工具类被用户的类调用,而框架则是 ...

  7. tkinter学习系列之(五)Checkbutton控件

    目录 目录 前言 (一)基本属性 (二)案例 1.简单的复选框 2.组合复选框 目录 前言 复选框:可以同时多选的一组框,其只有两种状态,选中与未选中. (一)基本属性 (1)说明: tkinter里 ...

  8. PHP实现简单下载功能

    PHP实现简单下载 PHP文件为download.php,供下载的文件为1.jpg. <?php $filename="1.jpg"; if(!file_exists($fi ...

  9. January 18th, 2018 Week 03rd Thursday

    To strive, to seek, to find, and not to yield. 去奋斗,去寻觅,去探索,但绝不屈服. Strive for our dreams, seek the ve ...

  10. 数据分组、统计 case when then else end

    case when 对表进行条件分组 case简单函数 case   age  when   then select name , sex , age , ( case age /*when 条件成立 ...