MYSQL必知必会读书笔记 第二十五章 使用触发器

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

1. 唯一的触发器名;

2.触发器关联的表;

3.触发器应该响应的活动(D,I,U)

4.触发器何时执行(处理之前或之后)。

下面一个简单的例子

创建触发器:

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

后面的SELECT语句是插入显示的功能。

需要注意的是:只要表才支持触发器,视图是不支持触发器的,临时表也不支持。并且每个表的每个事件只允许一个触发器。因此每个表最多支持6个触发器。单一触发器不能与多个事件或多个表关联,所以,如果你需要一个对INSERT和UPDATE操作执行的触发器,则应该定义两个触发器。

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

删除触发器:

DROP  TRIGGER newproduct;

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

INSERT 触发器

1.在INSERT触发器代码内,可引用一个名为NEW的虚拟表。访问被插入的行;

2.BEFORE  INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值);

3.对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。

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

是BEFORE 还是AFTER ?通常,将BEFORE用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据)

DELETE触发器:

1.DELETE触发器代码内,你可以引用一个名为OLD的虚拟表。访问被删除的行;

2.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触发器的优点(相对于AFTER  DELETE触发器来说),如果由于某种原因,订单不能存档,DELETE本身将被放弃。正如所见,触发器deleteorder触发器使用了BEGIN和END语句标记触发器体。这在此例子中并不是必须的,不过使用BEGIN  END块的好处是触发器能容纳多条SQL语句。

UPDATE触发器

1.在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表,引用一个NEW的虚拟表访问新更新的值。

2.BEFORE UPDATE触发器中,NEW中的值可能也被更新。

3.OLD中的值全都是只读的,不能更新。

保证州名都是大写:

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

遗憾的是MySQL中触发器中不支持CALL语句。这表示不能从触发器内调用存储过程。



你可能感兴趣的:(MYSQL数据库)