MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。
一、触发器
触发器是MySQL响应以下任意语句而自动执行的一条SELECT语句(或位于BEGIN和END语句之间的一组语句):
DELETE;
INSERT;
UPDATE。
其他MySQL语句不支持触发器。
二、创建触发器
在创建触发器时需要给出以下4条信息:
(1)唯一的触发器名;
(2)触发器关联的表;
(3)触发器应该相应的活动(DELETE、INSERT或UPDATE);
(4)触发器何时执行(处理之前或之后)。
触发器用CREATE TRIGGER语句创建。示例如下:
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';
CREATE TRIGGER 用来创建名为newproduct的新触发器。触发器可在一个操作发生之前或之后执行,这里给出了AFTER INSERT,所以此触发器将在 INSERT语句成功执行后执行。这个触发器还指定FOR EACH ROW,因此代码对每个插入行执行。在这个例子中,文本Product added将对每个插入的行显示一次。
三、删除触发器
DROP TRIGGER newproduct;
触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建。
四、使用触发器
1.INSERT触发器
INSERT触发器在INSERT语句执行之前或之后执行。需要知道以下几点:
(1)在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行;
(2)在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值);
(3)对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。
CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;
在插入一个新订单到orders表时,MySQL生成一个新订单号并保存在order_num中。触发器从NEW.order_num取得这个值并返回它。
为测试这个触发器,试着插入一下新行,示例如下:
INSERT INTO orders(order_date,cust_id) VALUES (Now(),10001);
2.DELETE触发器
DELETE触发器在DELETE语句执行之前或之后执行。需要知道以下两点:
(1)在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行;
(2)OLD中的值全都是只读的,不能更新。
下面的例子演示使用OLD保存将要被删除的行到一个存档表中:
CREATE TRIGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW
BEGIN
INSERT INTO archive_orders(order_num,order_date,cust_id)
VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);
END;
3.UPDATE触发器
UPDATE触发器在UPDATE语句执行之前或之后执行。需要知道以下几点:
(1)在UPDATE触发器代码中,可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值。
(2)在 BEFORE UPDATE触发器中,NEW中的值可能也被更新(允许更改将要用于UPDATE语句中的值);
(3)OLD中的值全都是只读的,不能更新。下面的例子保证州名缩写总是大写(不管UPDATE语句中给出的是大写还是小写):
CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_state=Upper(NEW.vend_state);