25. 使用触发器

1. 触发器

  1. 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句

    1. delete;
    2. insert;
    3. upate

2. 创建触发器

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

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

  3. 触发器用CREATE TRIGGER语句创建

    1. img
    2. CREATE TRIGGER用来创建名为newproduct的新触发器。触发器可在一个操作发生之前或之后执行,这里给出了AFTER INSERT,所以此触发器将在INSERT语句成功执行后执行。这个触发器还指定FOR EACH ROW,因此代码对每个插入行执行。在这个例子中,文本Product added将对每个插入的行显示一次。
    3. 为了测试这个触发器,使用INSERT语句添加一行或多行到products中,你将看到对每个成功的插入,显示Product added消息。
    4. 仅支持表只有表才支持触发器,视图不支持(临时表也不支持)
  4. 触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器(每条INSERT、UPDATE 和DELETE的之前和之后)。

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

3. 删除触发器

为了删除一个触发器,可使用DROP TRIGGER语句,

img

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

4. 使用触发器

4.1. INSERT触发器

  1. INSERT触发器在INSERT语句执行之前或之后执行

    1. 在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行
    2. 在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值)
    3. 对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值
  2. img
    1. img
  3. BEFORE或AFTER?通常,将BEFORE用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据)。本提示也适用于UPDATE触发器

4.2. DELETE触发器

  1. 在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行;
  2. OLD中的值全都是只读的,不能更新。
  3. 下面的例子演示使用OLD保存将要被删除的行到一个存档表中:
  4. img

4.3. UPDATE触发器

  1. UPDATE触发器在UPDATE语句执行之前或之后执行。需要知道以下几点:
  2. 在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值;
  3. 在BEFORE UPDATE触发器中,NEW中的值可能也被更新(允许更改将要用于UPDATE语句中的值);
  4. OLD中的值全都是只读的,不能更新
  5. img

25. 使用触发器
http://binbo-zappy.github.io/2024/11/27/mysql_bzbh/25-使用触发器/
作者
Binbo
发布于
2024年11月27日
许可协议