MySQL触发器是一种特殊的存储过程,它在满足特定条件时自动执行。触发器通常用于维护数据完整性、简化复杂的业务逻辑以及实现审计等功能。本文将详细介绍MySQL触发器的使用场景,并通过实战案例帮助读者深入理解其应用。
触发器(Trigger)是数据库对象之一,当某个事件发生时(如插入、更新或删除操作),触发器会自动执行预定义的操作。触发器可以绑定到表上,针对不同的操作类型(INSERT、UPDATE、DELETE)定义触发时机(BEFORE 或 AFTER)。
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
-- 触发器逻辑
END;
trigger_name
:触发器名称。{BEFORE | AFTER}
:触发器执行的时间点。{INSERT | UPDATE | DELETE}
:触发器响应的操作类型。table_name
:触发器关联的表。FOR EACH ROW
:表示每行数据都会触发一次触发器。BEGIN ... END
:触发器的具体逻辑。数据完整性
日志记录
复杂业务逻辑
默认值设置
防止非法操作
假设我们有一个博客系统,需要在每次更新文章内容时自动更新last_modified
字段。
步骤:
articles
。-- 创建测试表
CREATE TABLE articles (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255),
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
last_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 创建触发器
DELIMITER $$
CREATE TRIGGER update_last_modified
BEFORE UPDATE ON articles
FOR EACH ROW
BEGIN
SET NEW.last_modified = NOW();
END$$
DELIMITER ;
解释:
articles
表进行更新操作时,触发器会自动将last_modified
字段设置为当前时间。假设我们需要记录所有对用户表的操作,包括插入、更新和删除。
步骤:
users
和日志表user_logs
。-- 创建用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
email VARCHAR(100)
);
-- 创建日志表
CREATE TABLE user_logs (
log_id INT PRIMARY KEY AUTO_INCREMENT,
operation ENUM('INSERT', 'UPDATE', 'DELETE'),
user_id INT,
old_username VARCHAR(50),
new_username VARCHAR(50),
old_email VARCHAR(100),
new_email VARCHAR(100),
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入触发器
DELIMITER $$
CREATE TRIGGER log_insert
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (operation, user_id, new_username, new_email)
VALUES ('INSERT', NEW.id, NEW.username, NEW.email);
END$$
DELIMITER ;
-- 更新触发器
DELIMITER $$
CREATE TRIGGER log_update
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (operation, user_id, old_username, new_username, old_email, new_email)
VALUES ('UPDATE', OLD.id, OLD.username, NEW.username, OLD.email, NEW.email);
END$$
DELIMITER ;
-- 删除触发器
DELIMITER $$
CREATE TRIGGER log_delete
AFTER DELETE ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (operation, user_id, old_username, old_email)
VALUES ('DELETE', OLD.id, OLD.username, OLD.email);
END$$
DELIMITER ;
解释:
users
表进行插入、更新或删除操作时,触发器会自动将相关信息记录到user_logs
表中。假设我们希望禁止用户删除管理员账号。
步骤:
DELIMITER $$
CREATE TRIGGER prevent_admin_deletion
BEFORE DELETE ON users
FOR EACH ROW
BEGIN
IF OLD.username = 'admin' THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot delete admin account';
END IF;
END$$
DELIMITER ;
解释:
admin
的记录,触发器会抛出错误并阻止该操作。