本文共 1945 字,大约阅读时间需要 6 分钟。
触发器是一种数据库对象,用于在特定数据操作发生时自动执行预定义的操作。它能够帮助确保数据的完整性和一致性,虽然其使用可能带来性能开销,但在特定场景下非常有用。本文将详细介绍触发器的相关知识。
触发器与数据库表紧密相关,通常与INSERT
、UPDATE
或DELETE
操作事件相关联。在满足一定条件时,触发器会自动执行预定义的语句集合。以下是触发器的主要特性:
INSERT
、UPDATE
或DELETE
操作类型来触发。BEFORE
或AFTER
参数决定。触发器的主要用途是维护数据的完整性,例如在数据插入前检查格式是否正确,或在数据删除后备份记录。
创建触发器的语法和示例如下:
DELIMITER $$CREATE TRIGGER trig_name [DEFINER = user] TRIGGER timing Event ON table_name FOR EACH ROW [trigger_order] trigger_body$$DELIMITER ;
DELIMITER $$
:改变命令分隔符,避免触发器的语句被误解。CREATE TRIGGER
:创建触发器的命令,trig_name
为触发器名称。timing
:触发时机,BEFORE
或AFTER
。Event
:触发事件类型,INSERT
、UPDATE
或DELETE
。ON table_name
:指定关联的表。FOR EACH ROW
:触发器针对每一行数据执行。trigger_order
:在MySQL 5.7及以上版本,用于定义触发器执行顺序,FOLLOWS
或PRECEDES
。trigger_body
:触发器执行的具体语句,BEGIN
至END
之间的内容。DELIMITER $$CREATE TRIGGER tri_upd BEFORE UPDATE ON tag1 FOR EACH ROWBEGIN IF NEW.name != OLD.name THEN INSERT INTO tag2 (name) VALUES (NEW.name); END IF;END$$DELIMITER ;
DELIMITER $$CREATE TRIGGER tri_upd BEFORE DELETE ON work FOR EACH ROWBEGIN INSERT INTO time (time); INSERT INTO time (time);END$$DELIMITER ;
在触发器中,NEW
和OLD
用于引用数据变更前后的值:
NEW
:表示插入或更新后的新值,支持赋值操作且不会触发循环调用。OLD
:表示插入或更新前的旧值,只读。示例:
DELIMITER $$CREATE TRIGGER upd_check BEFORE UPDATE ON account FOR EACH ROWBEGIN IF NEW.amount < 0 THEN SET NEW.amount = 0; ELSE IF NEW.amount > 100 THEN SET NEW.amount = 100; END IF;END$$DELIMITER ;
使用以下方法查看触发器信息:
SHOW TRIGGERS
:列出所有触发器的基本信息。
information_schema.triggers
表:获取详细触发器信息,支持按名称查询。
示例:
SELECT * FROM information_schema.triggers WHERE trigger_name = 'upd_check';
删除触发器时,确保已知其名称:
DROP TRIGGER IF EXISTS [schema_name.]trigger_name;
通过合理使用触发器,能够有效提升数据库的数据管理能力,但也需权衡其带来的性能开销。
转载地址:http://ujbfk.baihongyu.com/