触发器

触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句):
 DELETE;
 INSERT;
 UPDATE。
其他MySQL语句不支持触发器。

创建触发器

在创建触发器时,需要给出4条信息:
 唯一的触发器名;
 触发器关联的表;
 触发器应该响应的活动(DELETE、INSERT或UPDATE);
 触发器何时执行(处理之前或之后)。

触发器用CREATE TRIGGER语句创建。下面是一个简单的例子:
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'product added' INTO @asd;
CREATE TRIGGER用来创建名为newproduct的新触发器。触发器可在一个操作发生之前或之后执行,这里给出了AFTER INSERT,所以此触发器将在INSERT语句成功执行后执行。这个触发器还指定FOR
EACH ROW,因此代码对每个插入行执行。在这个例子中,文本Product added将对每个插入的行显示一次。

INSERT 触发器

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

CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num into @new_order;
此代码创建一个名为neworder的触发器,它按照AFTER INSERTON orders执行。在插入一个新订单到orders表时,MySQL生成一个新订单号并保存到order_num中。触发器从NEW. order_num取得
这个值并返回它。此触发器必须按照AFTER INSERT执行,因为在BEFOREINSERT语句执行之前,新order_num还没有生成。对于orders的每次插入使用这个触发器将总是返回新的订单号

删除触发器

DROP TRIGGER TriggerName

BEFORE或AFTER?
通常,将BEFORE用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据)。本提示也适用于UPDATE触发器。

DELETE触发器

DELETE触发器在DELETE语句执行之前或之后执行。需要知道以下两点:
 在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行;
 OLD中的值全都是只读的,不能更新。

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

使用BEFORE DELETE触发器的优点(相对于AFTER DELETE触发器来说)为,如果由于某种原因,订单不能存档,DELETE本身将被放弃。

UPDATE触发器

UPDATE触发器在UPDATE语句执行之前或之后执行。需要知道以下几点:
 在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值;
 在BEFORE UPDATE触发器中,NEW中的值可能也被更新(允许更改将要用于UPDATE语句中的值);
 OLD中的值全都是只读的,不能更新。
CREATE TRIGGER befor_update BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_name=Upper(NEW.vend_name)
保证插入的是大写

posted @ 2020-09-29 15:21  bibicode  阅读(224)  评论(0)    收藏  举报