Mysql教程

9.5 本章实例

在本小节中将在product表上创建3个触发器。每次激活触发器后,都会更新opertate表。product表和operate表的内容如表9.51和表9.52所示。

字段名 字段描述 数据类型 主键 外键 非空 唯一 自增
id 产品编号 INT(10) 是 否 是 是 否
name 产品名称 VARCHAR(10) 否 否 是 否 否
function 主要功能 VARCHAR(50) 否 否 否 否 否
company 生产厂商 VARCHAR(20) 否 否 是 否 否
address 家庭住址 VARCHAR(50) 否 否 否 否 否
字段名 字段描述 数据类型 主键 外键 非空 唯一 自增
op_id 编号 INT(10) 是 否 是 是 是
op_type 操作方式 VARCHAR(20) 否 否 是 否 否
op_time 操作时间 TIME 否 否 是 否 否

按照下列要求进行操作:

1.在product 表上分别创建 BEFORE INSERT、AFTER UPDATE 和 AFTER DELETE 3 个触发器,触发器的名称分别为 product_bf_insert、product_af_update 和 product_af_deU 执行语句部分都是向operate表插入操作方法和操作时间。

2.对product表分别执行INSERT、UPDATE和DELETE操作。

3.删除product_bf_insert 和 product_af_update 这两个触发器。

本实例的执行过程如下:

1.创建product表和operate表

创建product表的SQL代码如下:

CREATE TABLE product (id INT(10) NOT NULL UNIQUE PRIMARY KEY ,name VARCHAR(20) NOT NULL , function VARCHAR(50), company VARCHAR(20) NOT NULL, address VARCHAR(50);

创建operate表的SQL代码如下:

CREATE TABLE operate(op_id INT(10) NOTNULL UNIQUE PRIMARY KEY AUTO_INCREMENT, op_name VARCHAR(20) NOT NULL,op_time TIME NOT NULL);

2.创建product_bf_insert触发器

创建product_bf_insert的SQL代码如下:

CREATE TRIGGER product_insert BEFORE INSERT ON product FOR EACH ROW INSERT INTO operate VALUES(null, 'Insert product', now());

创建完成后,执行SELECT语句来查看触发器的基本信息。代码执行结果如下:

mysql> SELECT * from information_schema.triggers where TRIGGER_NAME='product_bf_insert' \G
Empty set (0.19 sec)
mysql> SELECT * from information_schema.triggers where TRIGGER_NAME='product_insert' \G
*************************** 1. row ***************************
           TRIGGER_CATALOG: NULL
            TRIGGER_SCHEMA: example
              TRIGGER_NAME: product_bf_insert
        EVENT_MANIPULATION: INSERT
      EVENT_OBJECT_CATALOG: NULL
       EVENT_OBJECT_SCHEMA: example
        EVENT_OBJECT_TABLE: product
              ACTION_ORDER: 0
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: INSERT INTO operate VALUES(null, 'Insert product', now())
        ACTION_ORIENTATION: ROW
             ACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: OLD
  ACTION_REFERENCE_NEW_ROW: NEW
                   CREATED: NULL
                  SQL_MODE: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
                   DEFINER: root@localhost
      CHARACTER_SET_CLIENT: utf8
      COLLATION_CONNECTION: utf8_general_ci
        DATABASE_COLLATION: utf8_general_ci
1 row in set (0.19 sec)

执行结果显示,触发器product_bf_insert己经创建成功。

3创建product_af_update触发器

创建product_af_update的SQL代码如下:

CREATE TRIGGER product_af_update AFTER UPDATE ON product FOR EACH ROW INSERT INTO operate VALUES(null, 'Update product', now());

创建完成后,执行SELECT语句来查看触发器product_af_update的基本信息。

4.创建product_af_del触发器

创建product_af_del的SQL代码如下:

CREATE TRIGGER product_af_del AFTER DELETE ON product FOR EACH ROW INSERT INTO operate VALUES(null, 'delete product', now());

创建完成后,执行SELECT语句来查看触发器pmduct_af_del的基本信息。

5.对product进行操作

向product表中插入一条记录。SQL代码执行如下:

INSERT INTO product VALUES(1,'abc','治疗感冒','北京abc制药厂','北京市昌平区');

结果显示,product表的记录插入完成。而且,成功的触发了producr_bf_insert代触发器。

然后,更新product表的记录。将地址变为‘北京市海淀区’。SQL代码执行如下:

UPDATE product SET ADDRESS='北京市海淀区' WHERE id=1;

结果显示,PRODUCT表的记录更新完成。而且,成功的触发了product_af-update触发器。 最后,要在product表中删除一条记录。SQL代码执行如下:

DELETE FROM product WHERE id=1;

结果显示,记录删除成功。而且,成功触发了product_af_update触发器。

6.删除触发器

删除触发器product_bf_insert SQL代码执行如下:

DROP TRIGGER product_bf_insert;

触发器删除完成。执行SELECT语句来查看触发器是否还存在,SELECT语句执行 如下:

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='product_bf_insert\G

结果显示,触发器product_bf_insert已经不存在了。下面将删除触发器product_af_insert, 8卩[代码执行如下:

DROP TRIGGER product_af__update;

触发器product_af_update删除完成。


关注微信获取最新动态