MySQL——使用触发器(十八)

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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,...
    金星show阅读 843评论 0 3
  • 触发器 MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用...
    FTOLsXD阅读 959评论 0 1
  • MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子...
    沉默剑士阅读 7,460评论 0 16
  • 距离第一次到南沙,已是时隔七年之久了。那时,我是以一名普通的旅游者身份踏上这片神奇富饶的土地。南沙“一川蕉林绿,十...
    诗姬阅读 663评论 0 0
  • 不要问我为什么哥哥都那么帅,因为哥哥就是那么帅啊,哈哈~
    莫悇阅读 229评论 0 0