触发器(TRIGGER)是由事件来触发某个操作。这些事件包括INSERT语句、UPDATE语句和DELETE语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。MySQL从5.0.2版本开始支持触发器。在本文中将讲解的内容包括:
触发器的含义和作用
如何创建触发器
如何查看触发器
如何删除触发器
触发器是由INSERT、UPDATE和DELETE等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。例如,当学生表中增加了一个学生的信息时,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录,就执行一次计算学生总数的操作。这样就可以保证每次增加学生的记录后,学生总数是与记录数是一致的。触发器触发的执行语句可能只有一个,也可能有多个。本节将详细讲解创建触发器的方法。
创建只有一个执行语句的触发器
MySQL中,创建只有一个执行语句的触发器的基本形式如下:
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句
MySQL中,触发器触发的执行语句可能有多个。创建有多个执行语句的触发器的基本形式如下:
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件 ON 表名 FOR EACH ROW BEGIN 执行语句列表 END
1、命名规则
CREATE TRIGGER <触发器名称> <-- { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON <表名称> FOR EACH ROW BEGIN <触发器SQL语句> END
对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以在和NEW以及OLD同时使用。
先创建两个表、一个订单表,一个订单时间表
CREATE TABLE T_ORDER( ORDER_NUM INT PRIMARY KEY, ORDER_NAME CHAR(10) NOT NULL ); CREATE TABLE T_ORDER_TIME( ORDER_NUM INT PRIMARY KEY, ORDER_TIME TIMESTAMP NOT NULL, )
1、创建插入时的触发器
CREATE TRIGGER TRI_INSERT AFTER INSERT ON T_ORDER FOR EACH ROW BEGIN INSERT INTO learning.t_order_time(ORDER_NUM,ORDER_TIME) VALUES(NEW.ORDER_NUM,NOW()); END
INSERT INTO T_ORDER(ORDER_NUM,ORDER_NAME) VALUES(1,'电脑'); SELECT * FROM t_order; SELECT * FROM t_order_time;
这是订单时间表中自动插入的数据:
2、更新时插入数据
//更新创建触发器 CREATE TRIGGER TRI_UPDATA BEFORE UPDATE ON T_ORDER FOR EACH ROW BEGIN UPDATE learning.t_order_time SET ORDER_TIME=NOW() WHERE OLD.ORDER_NUM=ORDER_NUM; END UPDATE T_ORDER SET ORDER_NAME='饼干饼' WHERE ORDER_NUM=1; SELECT * FROM t_order; SELECT * FROM t_order_time;
可以看到,时间已经更新
3、创建删除触发器
//创建删除触发器 CREATE TRIGGER TRI_DELETE AFTER DELETE ON T_ORDER FOR EACH ROW BEGIN DELETE FROM learning.t_order_time WHERE OLD.ORDER_NUM=ORDER_NUM; END DELETE FROM learning.t_order WHERE ORDER_NUM=1; SELECT * FROM t_order; SELECT * FROM t_order_time;
4、查看触发器
查看触发器是指查看数据库中已存在的触发器的定义、状态和语法等信息。查看触发器的方法包括SHOW TRIGGERS语句和查询information_schema数据库下的triggers表等。本节将详细讲解查看触发器的方法。
MySQL中,可以执行SHOW TRIGGERS语句来查看触发器的基本信息。其基本形式如下:
SHOW TRIGGERS ;
MySQL中,所有触发器的定义都存在information_schema数据库下的triggers表中。查询triggers表,可以查看到数据库中所有触发器的详细信息。查询的语句如下:
SELECT * FROM information_schema.triggers;
DROP TRIGGER 触发器名
6、触发器 与存储过程
触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL
(允许存储程序通过参数将数据返回触发程序)。
而存储过程 可以接受参数,将结果范围给应用程序