本文共 1842 字,大约阅读时间需要 6 分钟。
在数据库设计中,某些操作需要在特定事件发生时自动执行。例如,当用户订购产品时,从库存中减去订购数量;或者删除数据时,自动将其备份到存档表。这种自动执行的功能可以通过触发器实现。
触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句或一组语句,前提是触发器关联到特定表。支持触发器的操作包括:
其他语句如SELECT、CREATE等不支持触发器。
触发器可以通过 CREATE TRIGGER
语句创建。伪代码示例如下:
CREATE TRIGGER newType AFTER INSERT ON ms_articletype FOR EACH ROW SELECT 'Product Added';
创建触发器需要提供以下信息:
newType
ms_articletype
DELETE
、INSERT
、UPDATE
AFTER INSERT
、BEFORE UPDATE
触发器不支持直接更新或覆盖,因此要修改触发器必须先删除它,再重新创建。删除触发器的语法如下:
DROP TRIGGER newType;
在 INSERT
语句执行前或后,触发器会自动执行。以下是使用 INSERT
触发器时需注意的事项:
NEW
的虚拟表访问被插入的行。BEFORE INSERT
触发器中,可以通过 NEW
修改被插入的数据。NEW
在 INSERT
执行前包含 0
,执行后包含新生成的自增值。示例:
在插入新类型时,触发器会自动记录日志。
CREATE TRIGGER logTypeInsert AFTER INSERT ON ms_articletype FOR EACH ROW INSERT INTO log_table (type, datetime) VALUES (NEW.type, CURRENT_TIMESTAMP);
在 DELETE
语句执行时,触发器会自动执行。以下是使用 DELETE
触发器时需注意的事项:
OLD
的虚拟表访问被删除的行。OLD
表中的数据不可修改,只能读取。示例:
当删除订单时,触发器会更新相关销售记录。
CREATE TRIGGER updateSales DELETE ON ms_order FOR EACH ROW UPDATE ms_sale SET total = total + (OLD.amount - NEW.amount) WHERE order_id = OLD.order_id;
在 UPDATE
语句执行时,触发器会自动执行。以下是使用 UPDATE
触发器时需注意的事项:
OLD
和 NEW
虚拟表。OLD
表中的值不可修改。BEFORE UPDATE
触发器中,可以修改 NEW
中的值,影响 UPDATE
语句的执行结果。示例:
当更新商品库存时,触发器会更新相关订单的数量。
CREATE TRIGGER updateInventory BEFORE UPDATE ON ms_goods FOR EACH ROW IF NEW.stock < OLD.stock THEN UPDATE ms_order SET stock = stock + (OLD.stock - NEW.stock) WHERE product_id = OLD.product_id;
以下是一个实际应用场景的触发器示例:
CREATE TRIGGER updateGoods AFTER UPDATE ON ms_sale FOR EACH ROW UPDATE ms_order SET or_number = or_number + (OLD.sale_number - NEW.sale_number) WHERE or_id = OLD.sale_or_id;
当销售订单数量被更新时,触发器会根据差异自动更新相关订单的数量。
转载地址:http://wibfk.baihongyu.com/