前言

现在很多都是程序用于触发的,而不是触发器了。

正文

需要MySQL 5 对触发器的支持是在MySQL 5中增加的。因此,本章内容适用于MySQL 5或之后的版本。

MySQL语句在需要时被执行,存储过程也是如此。但是,如果你想要某条语句(或某些语句)在事件发生时自动执行,怎么办呢?例如:

  1. 每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写;

  2. 每当订购一个产品时,都从库存数量中减去订购的数量;

  3. 无论何时删除一行,都在某个存档表中保留一个副本。

所有这些例子的共同之处是它们都需要在某个表发生更改时自动处理。这确切地说就是触发器。

触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句):

  1. DELETE

  2. INSERT

  3. UPDATE

在创建触发器时,需要给出4条信息:

  1. 唯一的触发器名;

  2. 触发器关联的表;

  3. 触发器应该响应的活动(DELETE、INSERT或UPDATE);

  4. 触发器何时执行(处理之前或之后)。

保持每个数据库的触发器名唯一 在MySQL 5中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一。

这表示同一数据库中的两个表可具有相同名字的触发器。

这在其他每个数据库触发器名必须唯一的DBMS中是不允许的,而且以后的MySQL版本很可能会使命名规则更为严格。

因此,现在最好是在数据库范围内使用唯一的触发器名。

例子:

CREATE TRIGGER newproduct AFTER INSERT on products
for EACH ROW INSERT INTO table1(teststring) VALUES('one');

触发:

INSERT INTO products(prod_id,vend_id,prod_name,prod_price,prod_desc) VALUES('dsada','1001','dsadsa',5.99,'1+1');

然后就被出发插入一条了。

触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。

因此,每个表最多支持6个触发器(每条INSERT、UPDATE和DELETE的之前和之后)。

单一触发器不能与多个事件或多个表关联,所以,如果你需要一个对INSERT和UPDATE操作执行的触发器,则应该定义两个触发器。

触发器失败 如果BEFORE触发器失败,则MySQL将不执行请
求的操作。此外,如果BEFORE触发器或语句本身失败,MySQL
将不执行AFTER触发器(如果有的话)。

删除触发器:

drop trigger newproduct;

触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,

然后再重新创建。

INSERT触发器在INSERT语句执行之前或之后执行。需要知道以下几

点:

1.在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行;

2.在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值)

3.对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。

下面举一个例子(一个实际有用的例子)。AUTO_INCREMENT列具有MySQL自动赋予的值。

CREATE TRIGGER neworder AFTER INSERT on orders
FOR EACH ROW SELECT NEW.order_num INTO @order_num;

然后使用:

INSERT INTO orders(order_date,cust_id)
VALUES(NOW(),10001);

然后查询:SELECT @order_num

SELECT @order_num

注意:

BEFORE或AFTER? 通常,将BEFORE用于数据验证和净化(目
的是保证插入表中的数据确实是需要的数据)。本提示也适用
于UPDATE触发器。

delete 触发器:

DELETE触发器在DELETE语句执行之前或之后执行。需要知道以下两

点:

  1. 在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访

    问被删除的行;
  2. OLD中的值全都是只读的,不能更新。

下面的例子演示使用OLD保存将要被删除的行到一个存档表中:

在任意订单被删除前将执行此触发器。它使用一条INSERT语句将OLD中的值(要被删除的订单)保存到一个名为archive_ orders的存档表中。

使用BEFORE DELETE触发器的优点(相对于AFTER DELETE触发器来说)为,如果由于某种原因,订单不能存档,DELETE本身将被放弃。

多语句触发器 正如所见,触发器deleteorder使用BEGIN和END语句标记触发器体。
这在此例子中并不是必需的,不过也没有害处。使用BEGIN END块的好处是触发器能容纳多条SQL语句(在BEGIN END块中一条挨着一条)。

UPDATE触发器:

UPDATE触发器在UPDATE语句执行之前或之后执行。需要知道以下几

点:

  1. 在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问

    以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新

    更新的值;

  2. 在BEFORE UPDATE触发器中,NEW中的值可能也被更新(允许更改

    将要用于UPDATE语句中的值)

  3. OLD中的值全都是只读的,不能更新。

何数据净化都需要在UPDATE语句之前进行,就像这个 例 子 中一样。

每次更新一个行时,NEW.vend_state中的值(将用来更新表行的值)都用Upper(NEW.vend_state)替换。

注意

  1. 与其他DBMS相比,MySQL 5中支持的触发器相当初级。未来的MySQL版本中有一些改进和增强触发器支持的计划。

  2. 创建触发器可能需要特殊的安全访问权限,但是,触发器的执行是自动的。如果INSERT、UPDATE或DELETE语句能够执行,则相关的触发器也能执行。

  3. 应该用触发器来保证数据的一致性(大小写、格式等)。在触发器中执行这种类型的处理的优点是它总是进行这种处理,而且是透明地进行,与客户机应用无关。

  4. 触发器的一种非常有意义的使用是创建审计跟踪。使用触发器,把更改(如果需要,甚至还有之前和之后的状态)记录到另一个表非常容易。

  5. 遗憾的是,MySQL触发器中不支持CALL语句。这表示不能从触发器内调用存储过程。所需的存储过程代码需要复制到触发器内。

下一节事务管理。

mysql 必知必会整理—触发器[十五]的更多相关文章

  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必知必会(第4版)整理笔记

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

  3. 《MySQL必知必会》学习笔记整理

    简介 此笔记只包含<MySQL必知必会>中部分章节的整理笔记.这部分章节主要是一些在<SQL必知必会>中并未讲解的独属于 MySQL 数据库的一些特性,如正则表达式.全文本搜索 ...

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

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

  5. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  6. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  7. mysql 必知必会总结

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

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

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

  9. MySql必知必会内容导图

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

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

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

随机推荐

  1. Codeforces Round 829 (Div. 1)A1. Make Nonzero Sum (easy version)(思维找规律)

    先考虑无解的情况:当n为奇数时无解 相邻的两个元素一定可以变成0 \[a[i] != a[i + 1]时, 分成[i, i], 和[i + 1, i + 1] \] \[a[i] = a[i + 1] ...

  2. 阿里巴巴/1688 api接口 获取商品详情 数据采集

    iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的阿里巴巴1688电商数据采集API,供用户按需调用. 接口使用详情请参考阿里巴巴1688接口 ...

  3. mainWindow = new BrowserWindow 打开慢的原因 electron 已解决 Windows Defender 拦截导致

    Windows Defender 导致拦截 不是变量的事儿 解决方案: win10 开始 设置 - windows 安全中心 - 病毒和威胁防护 - 病毒和威胁防护设置 - 排除项 - 添加排除项 将 ...

  4. 魅族16T屏幕尺子

  5. 使用JdbcTemplate

    1.使用JdbcTemplate的execute()方法执行SQL语句 Java代码  收藏代码 jdbcTemplate.execute("CREATE TABLE USER (user_ ...

  6. Spring Boot学习日记

    学习了springboot 的优点 为所有Spring开发者更快的入门 开箱即用,提供各种默认配置来简化项目配置 内嵌式容器简化Web项目 没有冗余代码生成和XML配置的要求 Spring开发-Hel ...

  7. 记录--JavaScript原型和原型链复习笔记

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 原型和原型链 1. 原型 每个JS对象一定对应一个原型对象,并从原型对象继承属性和方法 1.1 __proto__ 对象的__proto_ ...

  8. 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第7章

    本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录

  9. 【Oracle】通过LogMiner实现Oracle数据同步迁移

    写在前面 最近在研究如何实现Oracle数据库之间的数据同步,网上的资料确实比较少.最好用的Oracle数据库同步工具是:GoldenGate ,而GoldenGate是要收费的.那么还有什么好的办法 ...

  10. 详解SSL证书系列(7)HTTP的三大缺点

    我们已经了解到HTTP协议具有相当优秀和方便的一面,然而HTTP并非只有好的一面,事物皆具有两面性,它也是有不足之处的,那么HTTP有哪些缺点呢? 窃听风险 由于HTTP本身不具备加密的功能,所以也无 ...