目录
使用触发器
触发器
发生什么事情之后或之前,会自动执行某条语句,这就是触发器
创建触发器
创建触发器要给出的4条关键信息:
- 1.唯一的触发器名
- 2.触发器关联的表
- 3.触发器应该响应的活动(DELETE,INSERT or UPDATE)
- 4.触发器何时执行(处理之前or之后)
CREATE TRIGGER语句创建触发器
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';
FOR EACH ROW 代码对每个插入行执行。
删除触发器
DROP TRIGGER newproduct;
使用触发器
INSERT触发器
INSERT触发器在INSERT语句执行之前或之后执行。需要知道一下几点:
- 在INSERT触发器的代码内,可引用一个名为NEW 的虚拟表,访问被插入的行。
- 在BEFORE INSERT触发器中,NEW中 的值也可以被更新(允许更改被插入的值)
- 对于AUTO_INCREMENT列,NEW 在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。
CREATE TEIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;
这个触发器讲了咋个事情呢?你不要觉得云里雾里的,我们知道这个INSERT是不会显示什么信息出来的,所以我们加一个 AFTER INSERT
就是你只要一插入,我们就读出来这个订单号显示出来。就是这么一个功能,你不要想的太复杂了。所以你只能AFTER昂,BEFORE你能读出来个啥。
DELETE触发器
你也需要知道几点:
- 在DELETE触发器的代码中,你可以引用一个名为OLD的虚拟表,访问被删除的行。
- OLD中的值全都是只读,不能更新。
例:演示使用OLD保存将要删除的行到一个存档表中。
CREATE TRIGGER deleteorder BEFORE DELETE ON oreders 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;
UPDATE触发器
注意几点:
- 在UPDATE触发器代码中,你可以引用一个OLD的虚拟表访问以前的值,引用一个名为NEW的虚拟表访问更新的值。
- 在BEFORE UPDATE触发器中,NEW中的值可能也被更新
- OLD中的全是只读的。
例:保证州名缩写总是大写
CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_state = Upper(New.vend_state);
⭕️这个例子我想说一下,它这个的话就意味着我们对这个NEW的改变是会影响到实际表中的。这点应该注意到。
触发器的进一步介绍
MySQL触发器是不支持CALL语句的,这是十分遗憾的,所需的存储过程的代码需要复制到触发器内。