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. csharp: FTP Client Library using System.Net.FtpWebRequest

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  2. [总结]web前端常用JavaScript代码段及知识点集锦

    DOM相关 判断浏览器是否支持placeholder属性 function placeholderSupport() { return 'placeholder' in document.create ...

  3. SAP MM PIR里的Lower Limit & Upper Limit

    SAP MM PIR里的Lower Limit & Upper Limit 在PIR的价格的detail数据里,有2个字段:Lower Limit和Upper Limit.在今天之前,笔者从未 ...

  4. Windows 10修复

    [以管理员运行如下命令]: 1.sfc /scannow 命令将扫描所有受保护的系统文件,并用位于 %WinDir%\System32\dllcache 的压缩文件夹中的缓存副本替换损坏的文件. 2. ...

  5. PostGIS中生成GUID字段值

    create extension "uuid-ossp" update base_region set region_id = uuid_generate_v4() update ...

  6. Linux 学习笔记之超详细基础linux命令 Part 12

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 11---------------- ...

  7. 《ASP.NET MVC企业实战》(二) MVC开发前奏

    ​ 在上一篇“<ASP.NET MVC企业级实战>(一)MVC开发前奏”中记录了作者介绍的一些比较实用的VS使用方法以及C#2.0中添加的新特性.本篇继续大概了解之后版本的一些新特性.   ...

  8. 【转】HTTP协议之multipart/form-data请求分析

    原文链接:http://blog.csdn.net/five3/article/details/7181521 首先来了解什么是multipart/form-data请求: 根据http/1.1 rf ...

  9. 03-openldap服务端安装配置

    openldap服务端安装配置 阅读目录 基础环境准备 安装openldap服务端 初始化openldap配置 启动OpenLDAP 重新生成配置文件信息 规划OpenLDAP目录树组织架构 使用GU ...

  10. sql最简单的查询语句

    -- 2 **************************************************** -- 最简单的查询语句 -- 2.1 ----------------------- ...