1、概念 触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,一旦定义,任何用户 对表的增、删、改操作均由服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制。 2、定义触发器 create trigger 触发器名 before|after 触发事件
1、概念
触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,一旦定义,任何用户
对表的增、删、改操作均由服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制。
2、定义触发器
create trigger before|after on
for each row|statement [when ]
触发事件:可以是 insert、delete 或 update ,可以是几个事件的组合,用or连接
update 后面还可以有 of
触发器类型:分为 for each row(行级触发器)和 for each statement(语句级触发器,触发一次)
触发动作体:可以是一个过程块或是对已创建存储过程的调用,如果是行级触发器,可以在过程体中
使用 new 和 old 引用 update/insert 事件之后的新值和 update/delete 事件之前的旧值
3、激活触发器
同一个表上的多个触发器激活时的执行顺序:
1)执行该表上的 before 触发器
2)激活触发器的 SQL 语句
3)执行该表上的 after 触发器
查看触发器是否被激活:show triggers
4、删除触发器
drop trigger on
5、mysql 触发器实例
CREATE TABLE test1(a1 INT);CREATE TABLE test2(a2 INT);CREATE TABLE test3(a3 INT NOT<strong style="color:transparent">本文来源gaodai#ma#com搞@@代~&码*网/</strong> NULL AUTO_INCREMENT PRIMARY KEY);CREATE TABLE test4( a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0); DELIMITER | /* 改变输入结束符 */ CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END| DELIMITER ; INSERT INTO test3 (a3) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);如果将下述值插入表test1,如下所示:mysql> INSERT INTO test1 VALUES -> (1), (3), (1), (7), (1), (8), (4), (4);Query OK, 8 rows affected (0.01 sec)Records: 8 Duplicates: 0 Warnings: 0那么4个表中的数据如下:mysql> SELECT * FROM test1;+------+| a1 |+------+| 1 || 3 || 1 || 7 || 1 || 8 || 4 || 4 |+------+8 rows in set (0.00 sec) mysql> SELECT * FROM test2;+------+| a2 |+------+| 1 || 3 || 1 || 7 || 1 || 8 || 4 || 4 |+------+8 rows in set (0.00 sec) mysql> SELECT * FROM test3;+----+| a3 |+----+| 2 || 5 || 6 || 9 || 10 |+----+5 rows in set (0.00 sec) mysql> SELECT * FROM test4;+----+------+| a4 | b4 |+----+------+| 1 | 3 || 2 | 0 || 3 | 1 || 4 | 2 || 5 | 0 || 6 | 0 || 7 | 1 || 8 | 1 || 9 | 0 || 10 | 0 |+----+------+10 rows in set (0.00 sec)