一、创建触发器
触发器(TRIGGER)是由 INSERT、UPDATE 和 DELETE 等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样可以保证某些操作之间的一致性。
1、创建只有一个执行语句的触发器,基本形式如下:
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件
ON 表名 FOR EACH ROW 执行语句
其中,触发器名 参数指要创建的触发器的名字;BEFORE 和 AFTER 参数指定触发器执行的时间,BEFORE 指在触发事件之前执行触发语句,AFTER 指在触发事件之后执行触发语句; 触发事件 参数指触发的条件,其中包括 INSERT、UPDATE 和 DELETE;表名 参数指触发事件操作的表的名称;FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发该触发器;执行语句 参数 指触发器被触发后执行的程序。
mysql> CREATE TRIGGER dept_trig1 BEFORE INSERT
-> ON department FOR EACH ROW
-> INSERT INTO triger_time VALUES(NOW());
说明:当向department 表中执行INSERT 操作时,数据库系统都会在 INSERT 语句执行之前向 triger_time 表中插入当前时间。
2、创建有多个执行语句的触发器,基本形式如下:
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END
其中,BEGIN 与 END 中间的 执行语句列表 参数表示需要执行的多个执行语句的内容。不同的执行语句之间用分号隔开。
一般情况下MySQL默认是以“;”(分号)作为结束执行语句。在创建触发器过程中需要用到分号,为了解决这个问题,可以用DELIMITER 语句。如下:
mysql> DELIMITER &&
mysql> CREATE TRIGGER dept_trig2 AFTER DELETE
-> ON department FOR EACH ROW
-> BEGIN
-> INSERT INTO trigger_time VALUES(’21:01:01′);
-> INSERT INTO trigger_time VALUES(’22:01:01′);
-> END
-> &&
二、查看触发器
查看触发器是指查看数据库中已存在的触发器的定义、状态和语法等信息。查看触发器的方法包括 SHOW TRIGGERS 语句和查询 information_schma 数据库下的 triggers 表等。
mysql> SHOW TRIGGERS G 查询所有触发器的信息,不能查询指定的触发器
mysql> SELECT * FROM information_schema.triggers G 查询tiggers中的信息,会显示所有触发器的详细信息
mysql> SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME=’dept_trig1′ G 只查询dept_trig1触发器的详细信息。
三、触发器的使用
在MySQL中,触发器执行的顺序是 BEFORE 触发器、表操作(INSERT、UPDATE 和 DELETE) 和 AFTER 触发器。
在department 表上创建BEFORE INSERT 和 AFTER INSERT 这两个触发器。
mysql> CREATE TRIGGER before_insert BEFORE INSERT
-> ON department FOR EACH ROW
-> INSERT INTO trigger_test VALUES(null,”before_insert”); 创建BEFORE INSERT 触发器
mysql> CREATE TRIGGER after_insert AFTER INSERT
-> ON department FOR EACH ROW
-> INSERT INTO trigger_test VALUES(null,”after_insert”); 创建AFTER INSERT 触发器
mysql> INSERT INTO department VALUES(1003,’HAOHOA’,’HELLO’,’YES’); 向department插入一条记录用来实验前面两个触发器的动作先后顺序。
mysql> SELECT * FROM trigger_test; 可以查看到BEFORE INSERT 先于AFTER INSERT动作
+—-+—————+
| id | info |
+—-+—————+
| 1 | before_insert |
| 2 | after_insert |
+—-+—————+
1 row in set (0.00 sec)
四、删除触发器
删除触发器指删除数据库中已经存在的触发器。基本形式如下:
DROP TRIGGER 触发器名 | 数据库名.触发器名;
其中,触发器名 参数指要删除的触发器的名称。如果只指定触发器名称,数据库系统会在当前数据库下查找该触发器,如果找到就删除。 触发器名 | 数据库名.触发器名 表示两者选其中一个。不再需要的触发器一定要删除掉。
mysql> DROP TRIGGER test2.dept_trig1; 指定删除数据库test2下的触发器dept_trig1,如果不指定数据库test2,则删除当前数据库下的触发器dept_trig1。