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删除完成。