触发器(TRIGGER)是由事件来触发某个操作。这些事件包括INSERT语句、UPDATE语句和DELETE语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。MySQL从5.0.2版本开始支持触发器。
触发器是由INSERT、UPDATE和DELETE等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。例如,当学生表中增加了一个学生的信息时,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录,就执行一次计算学生总数的操作。这样就可以保证每次增加学生的记录后,学生总数是与记录数是一致的。触发器触发的执行语句可能只有一个,也可能有多个。
1、创建触发器
MySQL中,创建只有一个执行语句的触发器的基本形式如下:
- CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件
- ON 表名 FOR EACH ROW
- 执行语句
- CREATE TRIGGER product_bf_insert BEFORE INSERT
- ON product FOR EACH ROW
- INSERT INTO operate VALUES(null, 'Insert product', now());
MySQL中,触发器触发的执行语句可能有多个。创建有多个执行语句的触发器的基本形式如下:
- CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件
- ON 表名 FOR EACH ROW
- BEGIN
- 执行语句列表
- END
2、查看触发器
是指查看数据库中已存在的触发器的定义、状态和语法等信息。查看触发器的方法包括SHOW TRIGGERS语句和查询information_schema数据库下的triggers表等。
MySQL中,可以执行SHOW TRIGGERS语句来查看触发器的基本信息。其基本形式如下:
SHOW TRIGGERS ;
MySQL中,所有触发器的定义都存在information_schema数据库下的triggers表中。查询triggers表,可以查看到数据库中所有触发器的详细信息。查询的语句如下:
SELECT * FROM information_schema. triggers ;
3、触发器的使用
MySQL中,触发器执行的顺序是BEFORE触发器、表操作(INSERT、UPDATE 和DELETE)、AFTER触发器。
下面通过一个示例演示这三者的执行顺序。
【示例9-6】下面在department表上创建BEFORE INSERT和AFTER INSERT这两个触发器。在向department表中插入数据时,观察这两个触发器的触发顺序。创建触发器的代码如下:
- CREATE TRIGGER before_insert BEFORE INSERT
- ON department FOR EACH ROW
- INSERT INTO trigger_test VALUES(null, " before_insert ");
- CREATE TRIGGER after_insert AFTER INSERT
- ON department FOR EACH ROW
- INSERT INTO trigger_test VALUES(null, " after_insert ");
读者
在创建触发器后,一定要查看触发器的结构
4、删除触发器
删除触发器指删除数据库中已经存在的触发器。MySQL中使用DROP TRIGGER语句来删除触发器。
其基本形式如下:
DROP TRIGGER 触发器名 ;
本章介绍了MySQL数据库的触发器的定义和作用、创建触发器、查看触发器、使用触发器、删除触发器等内容。创建触发器和使用触发器是本章的重点内容。读者在创建触发器后,一定要查看触发器的结构。使用触发器时,触发器执行的顺序是BEFORE触发器、表操作(INSERT、UPDATE 和DELETE)、AFTER触发器。创建触发器是本章的难点。读者需要将本章的知识结合实际需要来设计触发器。
为一个表创建一个触发器,然后把它的操作记录到另一个表中
- 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)
- );
- CREATE TABLE operate (
- op_id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT ,
- op_name VARCHAR(20) NOT NULL ,
- op_tiem TIME NOT NULL
- );
- CREATE TRIGGER product_bf_insert BEFORE INSERT
- ON product FOR EACH ROW
- INSERT INTO operate VALUES(null, 'Insert product', now());
- show triggers
阅读(655) | 评论(0) | 转发(0) |