MySQL数据库的触发器的使用
使用触发器
触发器
发生什么事情之后或之前,会自动执行某条语句,这就是触发器
创建触发器
创建触发器要给出的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
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;
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;
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);
FOR EACH ROW SET NEW.vend_state = Upper(New.vend_state);
⭕️这个例子我想说一下,它这个的话就意味着我们对这个NEW的改变是会影响到实际表中的。这点应该注意到。
触发器的进一步介绍
MySQL触发器是不支持CALL语句的,这是十分遗憾的,所需的存储过程的代码需要复制到触发器内。
到此这篇关于MySQL数据库的触发器的使用的文章就介绍到这了,更多相关MySQL触发器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!