前言

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

正文

需要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. RocketMQ(7) 消费幂等

    1 什么是消费幂等 当出现消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消 费并未对业务系统产生任何负面影响,那么这个消费过程就是消费幂等的. 幂等:若某操作执行多 ...

  2. idea技巧-自定义后缀补全

    Idea技巧-Postfix Completion 在idea中可以使用.xxx进行后缀补全 比如.sout 如何自定义后缀补全? 比如.log 在idea中打开设置 File | Settings ...

  3. 探索Git内部原理

    Git是一个开源的分布式版本控制系统,是目前主流的版本控制系统,很多软件项目都会用它做源代码管理.Git的常用操作想必很多人都会,但是可能了解Git内部原理的人并不多.了解一些底层的东西,可以更好的帮 ...

  4. python可视化工具pyecharts初相识

    一 概念 1.pyecahrts基础 某度开源了一个python的可视化工具pyecharts,该工具凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可.而 python 是一门富有表达力的语 ...

  5. day06-Java流程控制

    Java流程控制 1.用户交互Scanner java.util.Scanner是Java5的新特征,我们可以通过Scannner类来获取用户的输入. 基本语法: Scanner s = new Sc ...

  6. JavaScript知识总结 ES6篇

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. let.const.var的区别 (1)块级作用域:块作用域由 { }包括,let和const具有块级作用域,var不存在块级作用域 ...

  7. 记录--Vue自定义指令实现加载中效果v-load(不使用Vue.extend)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 网站效果演示:ashuai.work:8888/#/myLoad GitHub仓库地址代码:github.com/shuirongshu- ...

  8. 动态水印也能去除?ProPainter一键视频抠图整合包下载

    ProPainter是一个基于E2FGVI实现的AI视频编辑工具,它结合了增强的传播和Transformer机制,能够快速高效地进行视频修复和水印去除 功能特点 · 对象移除:智能地检测和移除视频中的 ...

  9. 面试官:只知道v-model是:modelValue和@onUpdate语法糖,那你可以走了

    前言 我们每天都在用v-model,并且大家都知道在vue3中v-model是:modelValue和@update:modelValue的语法糖.那你知道v-model指令是如何变成组件上的mode ...

  10. Games101:作业6

    说明 本次作业主要实现对上一次作业代码的重构以及使用BVH加速求交的交点判断和递归调用 代码框架的修改 有影响的改动就是框架中定义了两个结构体一个是光线ray,一个是交点Intersection 交点 ...