MySQL必知必会 第25章-使用触发器

25.1 触发器

触发器适用于MySQL 5及以后的版本
某条语句(某些语句)在事件发生时自动执行(在某个表发生改变时自动处理)
触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语气):

  • DELETE
  • INSERT
  • UPDATE

其他MySQL语句不支持触发器

25.2 创建触发器

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

  • 唯一的触发器名(必须在每个表中唯一,最好在数据库范围内使用唯一的触发器名)
  • 触发器关联的表
  • 触发器应该响应的活动(DELETE、INSERT、UPDATE)
  • 触发器何时执行(处理之前或之后)

触发器由CREATE TRIGGER语句创建

CREATE TRIGGER newproduct AFTER INSERT ON products
FOR EACH ROW SELECT 'Product added';

FOR EACH ROW:代码对每个插入行执行
文本 'Product added’将对每个插入的行显示一次

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

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

25.3 删除触发器

DROP TRIGGER newproduct;

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

25.4 使用触发器

25.4.1 INSERT触发器

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

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

对于orders的每次插入使用这个触发器将总是返回新的订单号。

CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW SELECT NEW.order_num;

测试触发器:

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

通常将BEFORE用于数据验证和净化。

25.4.2 DELETE触发器

  • 在DELETE触发器代码内,可以引用一个名为OLD的虚拟表,访问被删除的行;
  • OLD中的值只能读,不能更新

使用OLD保存将要删除的行到一个存档表中:

CREATE TRIGGER deleteorder BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
	INSERT INTO archive_orders(order_num,order_date,cust_id)
	VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);
END;

使用BEFORE DELETE 触发器的优点:如果由于某种原因,订单不能存档,DELETE本身将被放弃。
多语句触发器:使用BEGIN END的好处是触发器能容纳多条SQL语句

25.4.3 UPDATE触发器

  • 在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值;
  • 在BEFORE UPDATE触发器中,NEW中的值可能也被更新(允许更改将要用于UPDATE语句中的值)
  • OLD中的值全都是只读的,不可更新。

保证州名缩写总是大写(不管UPDATE语句中给出的是大写还是小写)

CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors
FOR EACH ROW SET NEW.vend_state=Upper(NEW.vend_state);

25.4.4 关于触发器的进一步介绍

  • 与其他DBMS相比,MySQL 5支持的触发器相当初级
  • 创建触发器可能需要特殊的安全访问权限,但是触发器的执行是自动的。
  • 应该用触发器来保证数据的一致性(大小写、格式等)
  • 创建审计跟踪。使用触发器,把更改(如果需要,甚至还有之前和之后的状态)记录到另一个表非常容易。
  • MySQL触发器不支持CALL语句,不能从触发器内调用存储过程。所需的存储过程代码需要复制到触发器内。

你可能感兴趣的:(mysql必知必会,mysql,数据库)