MySQL 中的触发器(Trigger)是一种特殊类型的存储过程,它会在指定的数据库表上执行指定的数据修改语句(INSERT、UPDATE 或 DELETE)时自动执行。触发器可以用于保证数据的完整性,自动生成数据,或者维护复杂的业务规则等。
创建触发器
在 MySQL 中,你可以使用 CREATE TRIGGER
语句来创建触发器。这个语句的基本语法如下:
CREATE TRIGGER trigger_name | |
BEFORE|AFTER INSERT|UPDATE|DELETE | |
ON table_name FOR EACH ROW | |
BEGIN | |
-- 触发器体 | |
END; |
- trigger_name:触发器的名称,在数据库中必须是唯一的。
- BEFORE|AFTER:指定触发器是在数据修改之前(BEFORE)还是之后(AFTER)触发。
- INSERT|UPDATE|DELETE:指定触发器响应的数据修改类型。
- table_name:触发器关联的表名。
- FOR EACH ROW:表示触发器会对表中的每一行数据执行操作。
- 触发器体:包含触发器被激活时要执行的 SQL 语句。
示例
假设我们有一个 employees
表,我们希望在每次向该表插入新记录时,都自动将插入的时间记录到另一个表 employee_logs
中。
首先,我们创建 employee_logs
表:
sql复制代码
CREATE TABLE employee_logs ( | |
log_id INT AUTO_INCREMENT PRIMARY KEY, | |
employee_id INT, | |
action VARCHAR(50), | |
action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP | |
); |
然后,我们创建触发器:
DELIMITER $$ | |
CREATE TRIGGER before_employee_insert | |
BEFORE INSERT | |
ON employees FOR EACH ROW | |
BEGIN | |
INSERT INTO employee_logs(employee_id, action) | |
VALUES (NEW.id, 'Inserted'); | |
END$$ | |
DELIMITER ; |
注意:
- 这里我们使用了
DELIMITER
来改变语句的结束符,因为在触发器体中可能会包含多个语句,而 MySQL 默认的分号(;
)会结束整个CREATE TRIGGER
语句。我们将结束符改为$$
,然后在触发器体结束后又改回;
。 NEW.id
指的是即将被插入到employees
表中的新记录的id
字段的值。
查看触发器
你可以使用 SHOW TRIGGERS;
语句来查看数据库中的所有触发器,或者使用 SHOW CREATE TRIGGER trigger_name;
来查看特定触发器的创建语句。
删除触发器
如果你不再需要某个触发器,可以使用 DROP TRIGGER
语句来删除它:
DROP TRIGGER trigger_name; |
触发器是 MySQL 中非常强大的功能,但也需要谨慎使用,因为它们可能会在不经意间影响数据库的性能或引入难以追踪的错误。