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. css iphonex适配

    /*  iphonex适配 */ @media only screen and (device-width:375px) and (-webkit-device-pixel-ratio: 3) { . ...

  2. VUE组件 之 Toast (Vue.extend 方式)

    一.效果图 二.说明 这类提示框组件我们通常都会直接在 JS 代码中进行调用.像下面这样: this.$toast('别点啦,到头啦!') 但看到网上大多数还是通过 component  方式实现的, ...

  3. 最新安全狗 apache v4.0 sql注入 bypass

    前言 最近没事学习一下 waf 的 bypass , 本文介绍下 bypass 安全狗的笔记.个人感觉 bypass 的总思路(正则匹配型 waf)就是利用各种语法特性来逃避正则(当然要保证语法正确性 ...

  4. iOS-WKWebView的使用

    参考文章:http://www.cocoachina.com/ios/20180831/24753.html WK时苹果在iOS8.0之后推出的控件,相比于UIWebView: 内存消耗少: 解决了网 ...

  5. Apktool(1)——Apktool的安装

    Apktool是google提供的apk的编译工具,有了它就可以做很多事情.比如获取apk的源码,apk汉化,对手机rom包做一些美化. 首先来看看apktool的安装(配置): 以下内容主要翻译字A ...

  6. maven(九),install安装到本地仓库

    下载oracle驱动jar包 在maven中央仓库中,是没有oracle驱动jar包的.因为oracle是商业软件,其jar包不允许用作开源用途.从http://www.mvnrepository.c ...

  7. Nginx下配置网站SSL实现https访问本站就是用的这方法

    本文出至:新太潮流网络博客 第一步:服务器环境,lnmp即Linux+Nginx+PHP+MySQL,本文中以我的博客为例,使用的是阿里云最低档的ECS+免费的Linux服务器管理系统WDCP快速搭建 ...

  8. HTTP协议响应码及get请求和post请求比较

    HTTP协议响应码 1XX:信息响应类,表示接收到请求并且继续处理 2XX:处理成功响应类,表示动作被成功接受.理解和接受 200 OK:表示从客户端发来的请求在服务器端被正常处理了 204 No C ...

  9. 联想笔记本Y7000P安装nvidia,cuda,tensorflow,pytorch

    Y7000P电脑环境i7处理器,1060显卡,16g内存,win10家庭版(系统版本号1809),在联想官网升级过bios,所有驱动都是最新.(截止时间点2019年3月1日) python3.5 安装 ...

  10. HDU 2865 Birthday Toy

    题目链接 题意:n个小珠子组成的正n边形,中间有一个大珠子.有木棍相连的两个珠子不能有相同的颜色,旋转后相同视为相同的方案,求着色方案数. \(\\\) 先选定一种颜色放在中间,剩下的\(k-1\)种 ...