数据库入门:MySQL必知必会(二十五)使用触发器

二十五、使用触发器

    • 01. 触发器
    • 02. 创建触发器
    • 03. 删除触发器
    • 04. 使用触发器
    • 05. 下一篇:[管理事务处理](https://blog.csdn.net/qq_34114121/article/details/92739478)

01. 触发器

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

  1. 每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写;
  2. 每当订购一个产品时,都从库存数量中减去订购的数量;
  3. 无论何时删除一行,都在某个存档表中保留一个副本;

所有这些例子的共同之处是它们都需要在某个表发生更改时自动处理,这确切地说就是触发器。触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句):

  1. DELETE;
  2. INSERT;
  3. UPDATE;

其他MySQL语句不支持触发器。

02. 创建触发器

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

  1. 唯一的触发器名;
  2. 触发器关联的表;
  3. 触发器应该响应的活动(DELETE、INSERT或UPDATE);
  4. 触发器何时执行(处理之前或之后);

触发器用CREATE TRIGGER语句创建:
创建触发器

  1. 触发器可在一个操作发生之前或之后执行,这里给出了AFTER INSERT,所以此触发器将在INSERT语句成功执行后执行;
  2. 这个触发器还指定FOR EACH ROW,因此代码对每个插入行执行;
  3. 测试这个触发器,使用INSERT语句添加一行或多行到products中,对每个成功的插入,显示Product added消息

仅支持表:只有表才支持触发器,视图不支持(临时表也不支持)。

触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器(每条INSERT、UPDATE和DELETE的之前和之后)。
单一触发器不能与多个事件或多个表关联,所以,如果你需要一个对INSERT和UPDATE操作执行的触发器,则应该定义两个触发器。

03. 删除触发器

为了删除一个触发器,可使用DROP TRIGGER语句:
删除触发器
触发器不能更新或覆盖,为了修改一个触发器,必须先删除它,然后再重新创建。

04. 使用触发器

  1. INSERT触发器:
    1.1 INSERT触发器在INSERT语句执行之前或之后执行:
    在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行;
    在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值);
    对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT
    执行之后包含新的自动生成值;

    1.2 AUTO_INCREMENT列具有MySQL自动赋予的值,确定新生成值:
    INSERT触发器
    在插入一个新订单到orders表时,MySQL生成一个新订单号并保存到order_num中;
    1.3 测试这个触发器:
    数据库入门:MySQL必知必会(二十五)使用触发器_第1张图片
  2. DELETE触发器:
    2.1 DELETE触发器在DELETE语句执行之前或之后执行:
    在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行;
    OLD中的值全都是只读的,不能更新;
    2.2 使用OLD保存将要被删除的行到一个存档表:
    数据库入门:MySQL必知必会(二十五)使用触发器_第2张图片
    使用一条INSERT语句将OLD中的值(要被删除的订单)保存到一个名为archive_orders的存档表中;
  3. UPDATE触发器:
    3.1 UPDATE触发器在UPDATE语句执行之前或之后执行:
    在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值;
    在BEFORE UPDATE触发器中,NEW中的值可能也被更新;
    OLD中的值全都是只读的,不能更新;
    3.2 保证州名缩写总是大写:
    UPDATE
    每次更新一个行时,NEW.vend_state中的值(将用来更新表行的值)都用Upper(NEW.vend_state)替换;
  4. 关于触发器的进一步介绍:
    4.1 与其他DBMS相比,MySQL 5中支持的触发器相当初级:未来的MySQL版本中有一些改进和增强触发器支持的计划;
    4.2 创建触发器可能需要特殊的安全访问权限,但是,触发器的执行是自动的;如果INSERT、UPDATE或DELETE语句能够执行,则相关的触发器也能执行;
    4.3 应该用触发器来保证数据的一致性:在触发器中执行这种类型的处理的优点是它总是进行这种处理,而且是透明地进行,与客户机应用无关;
    4.4 触发器的一种非常有意义的使用是创建审计跟踪:使用触发器,把更改记录到另一个表非常容易;
    4.5 遗憾的是,MySQL触发器中不支持CALL语句:这表示不能从触发器内调用存储过程,所需的存储过程代码需要复制到触发器内。

05. 下一篇:管理事务处理

你可能感兴趣的:(MySQL数据库,MySQL数据库学习)