前言

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

正文

需要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. Android---Android 开发四大组件

    Android 应用程序组件 应用程序组件是一个Android应用程序的基本构建块.这些组件由应用清单文件松耦合的组织.AndroidManifest.xml描述了应用程序的每个组件,以及他们如何交互 ...

  2. 2022年RPA行业发展十大趋势,六千字长文助你看懂RPA

    2022年RPA行业发展十大趋势,六千字长文助你看懂RPA 2022年RPA行业如何发展?十大趋势助你看懂RPA行业未来 这里有2022年RPA行业发展的十大趋势,关注RPA的朋友定要收藏! 文/王吉 ...

  3. [笔记]git pull vs git pull --rebase

    git pull vs git pull -rebase 背景 最近在实际开发过程,之前一直使用git pull 去更新该分支的代码,之前认为一旦pull 操作产生新的节点是对合并操作的一个记录,但是 ...

  4. 用java实现书城项目(简单增删改查2)

    书城项目 登录 dao 接口:UserDao Users login(String username,String password); 实现:UserDaoImpl QueryRunner quer ...

  5. .vscode/extensions.json 是项目用到的 插件 推荐列表,项目应该将此配置 写入用到的插件

    .vscode/extensions.json 是项目用到的 插件 推荐列表,项目应该将此配置 写入用到的插件 .vscode/extensions.json { "recommendati ...

  6. 可穿戴设备主控制器芯片AMA3B 源码解析之初体验

    一 背景和缘由   现在的mcu非常多,在超低功耗mcu这块,能赢得市场穿戴式设备使用的产品的确不多,以前是的是stm32 L系列,可是,随着L系列的缺货涨价和技术指标没有快速的发展,很多厂商都抛弃了 ...

  7. ETL工具-KETTLE教程实例实战2----环境介绍

    一.整体结构图 Kettle 是"Kettle E.T.T.L. Envirnonment"只取首字母的缩写,这意味着它被设计用来帮助你实现你的ETTL 需要:抽取.转换.装入和加 ...

  8. JavaFx 圆形头像实现

    原文:JavaFx 圆形头像实现 - Stars-One的杂货小窝 本文基于TornadoFx框架进行编写,封装工具代码是kotlin版本 圆形头像框组件封装成了stars-one/common-co ...

  9. 在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手

    本文首发于公众号:Hunter后端 原文链接:在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手 最近 ChatGPT 式的聊天机器人比较火,可以提供各种问答功能,阿里最 ...

  10. SnapHelper源码深度解析

    目录介绍 01.SnapHelper简单介绍 1.1 SnapHelper作用 1.2 SnapHelper类分析 1.3 LinearSnapHelper类分析 1.4 PagerSnapHelpe ...