触发器是什么?
可以把它想象成一个陷阱
- 触发事件就像是触发 “陷阱” 的条件,比如当有数据插入、更新或删除这些操作发生时,就好像是有人或者某个东西触碰到了 “陷阱” 的机关。
- 触发条件则像是 “陷阱” 的保险装置,只有当满足特定的条件时,“陷阱” 才会真正起作用。也就是说,不是只要有插入、更新或删除操作就一定会触发触发器,还得看是否满足额外设定的触发条件,就像有些陷阱需要踩到特定的位置或者达到一定的重量等条件才会触发。
- 触发动作就是 “陷阱” 被触发后所执行的一系列操作啦,比如 “陷阱” 可能会弹出一个笼子把人困住,或者释放出一些烟雾等,对应到数据库中就是执行一些如插入新记录、更新数据、删除数据等具体的 SQL 操作。
触发器的定义:
MySQL 中定义触发器
语法
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
FOR EACH ROW
trigger_body;
trigger_name
:触发器的名称,需要保证在数据库中唯一。BEFORE | AFTER
:指定触发器是在触发事件之前还是之后执行。INSERT | UPDATE | DELETE
:指定触发事件的类型。table_name
:触发器所关联的表名。FOR EACH ROW
:表示对受影响的每一行数据都执行一次触发器操作(行级触发器)。trigger_body
:触发器要执行的 SQL 语句。-
示例
-
假设有两个表:
orders
(订单表)和order_logs
(订单日志表)。当向orders
表中插入一条新订单记录时,我们希望在order_logs
表中记录下插入操作的相关信息。
-- 创建订单表
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(100),
quantity INT
);
-- 创建订单日志表
CREATE TABLE order_logs (
log_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
action VARCHAR(20),
log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建触发器
DELIMITER //
CREATE TRIGGER after_insert_order
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_logs (order_id, action)
VALUES (NEW.order_id, 'INSERT');
END //
DELIMITER ;
在上述示例中:
after_insert_order
是触发器的名称。AFTER INSERT
表示在orders
表插入操作之后触发。FOR EACH ROW
表示对插入的每一行数据都执行触发器。NEW
是 MySQL 中用于引用插入操作中新插入的行的关键字。