MySQL学习笔记(12):触发器
本文更新于2019-06-23,使用MySQL 5.7,操作系统为Deepin 15.4。
目录
- SQL语句
- 示例
SQL语句
为了便于描述,此处将创建触发器的DDL复述一次,其已于“SQL”章节描述。
CREATE TRIGGER triggername BEFORE|AFTER INSERT|UPDATE|DELETE
ON tablename FOR EACH ROW
statement_list
在statement_list中使用别名OLD
和NEW
来引用触发器中发生变化的旧记录和新记录内容。目前触发器只支持行级触发,不支持语句级触发。
触发器是行触发的,按照BEFORE
触发器、行操作、AFTER
触发器的顺序执行,任何一步出错都不会继续执行余下操作。如果是事务表,则会整个作为一个事务回滚。对INSERT INTO ... ON DUPLICATE KEY UPDATE ...
语句,若有重复主键的记录需进行UPDATE
,触发顺序为BEFORE INSERT
、BEFORE UPDATE
、AFTER UPDATE
;若没有重复主键的记录直接INSERT
,触发顺序为BEFORE INSERT
、AFTER INSERT
。
statement_list可以通过存储过程或函数的OUT
或INOUT
参数将数据返回触发器,但不能调用直接RETURNS
的函数。也不能显式或隐式开始或结束事务,如START TRANSACTION
、COMMIT
、ROLLBACK
。
示例
DELIMITER ;;
CREATE TRIGGER trigger_test BEFORE UPDATE
ON t FOR EACH ROW
BEGIN
INSERT INTO history(old_id, old_value, new_id, new_value) VALUES (OLD.id, OLD.value, NEW.id, NEW.value);
END;;
DELIMITER ;
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341