数据库触发器

来源:互联网 发布:淘宝助理5怎么上传图片 编辑:程序博客网 时间:2024/06/14 05:18

触发器

想要某条语句在事件发生时自动执行(某表发生改动时,自动处理)
除下列三个关键字意外的不支持触发器

  • INSERT
  • DELETE
  • UPDATE

创建触发器

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

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

    触发器必须在每个表中唯一,但不是在每个数据库中唯一,这表示同一个数据库中的两个表的触发器可具有相同的名字。但最好在数据库中使用唯一的触发器名。

    触发器用CREATE TRIGGER语句创建。例子:

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

分析:
CREATE TRIGGER用来创建名为newproduct的新触发器。触发器可在一个操作发生之前或之后,这里给出了AFTER INSERT,所以此触发器将在INSERT语句成功执行后执行。这个触发器还指定FOR EACH ROW,因此代码对每个插入行执行。文本Product added将对每个插入的行显示一次。

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

 触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器(每条UPDATE、DELETE、INSERT)。单一触发器不能与多个事件或多个表关联。

删除触发器

DROP TRIGGER newproduct;

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

INSERT触发器

  • INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行
  • 在BEFORE INSERT触发器中,NEW中的值也可被更新
  • 对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT之后包含新的自动生成值。
CREATE TRIGGER neworder AFTER INSERT ON ordersFOR EACH ROW SELECT NEW.order_num;

 创建一个名为neworder的触发器,它按照AFTER INSERT ON orders执行。在插入一个新订单到orders表时,MySQL生成一个新订单号并保存到order_num中。触发器从NEW.order_num取得这个值并返回它。此触发器必须按AFTER INSERT执行,因为在BEFORE INSERT语句执行前,新order_num还没有生成。对于orders每次插入使用这个触发器总是返回新的订单号。
 为测试这个触发器,试插入一下新行

INSERT INTO orders(order_date,cust_id)VALUES(NOW(),10001);#输出order_num20010

DELETE触发器

  • DELETE 触发器在DELETE语句执行之前或之后执行。
  • DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行
  • OLD中的值全部都是只读的,不能更新。
CREATE TRIGGER deleteorder BEFORE DELETE ON ordersFOR EACH ROWBEGIN    INSERT INTO archive_orders(order_num,order_date,cust_id)    VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);END;

 任意订单被删除前将执行此触发器。它使用一条INSERT语句将OLD中的值保存到一个名为archive_orders的存档表中(为实际使用这个例子,你需要用于orders相同的列创建一个名为archive_orders的表)

UPDATE触发器

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