日期:2014-05-16  浏览次数:20818 次

mysql触发器实例

有一个学生管理程序,涉及到学生的证书,在这个程序里,学生可以自己添加一个或多个证书,把自己的证书信息添加到系统里,之后管理员对这些信息进行审核,确定证书的真实性。当学员的所有证书都审核通过后,学员的状态就会变为诚信,反之,只要有一个证书没有审核通过,学员状态就变为非诚信。或者是学员又重新上传了一个证书后,学员状态又变为非诚信,当管理员审核通过后,学员状态即改为程序。

学员表结构:(这里为了简单,省去或修改了部分信息)

学员ID,名称,性别,状态

证书表结构:

证书ID,名称,状态,学员ID

首先来创建这两个表,如下是建表语句:

view plaincopy to clipboardprint?
/**
* 创建一个学生表
*??
*/
CREATE TABLE `students` (??
`id` INTEGER NOT NULL AUTO_INCREMENT,??
`name` VARCHAR(45) NOT NULL,??
`sex` VARCHAR(1) NOT NULL,??
`status` INTEGER NOT NULL,??
PRIMARY KEY (`id`)??
)??
ENGINE = InnoDB;??

/**
* 创建一个证书表
*??
*/
CREATE TABLE `certs` (??
`id` INTEGER NOT NULL AUTO_INCREMENT,??
`name` VARCHAR(45) NOT NULL,??
`status` INTEGER NOT NULL,??
`student_id` INTEGER NOT NULL,??
PRIMARY KEY (`id`)??
)??
ENGINE = InnoDB;

?/**

插入学生数据
*
*/
INSERT INTO students (id, name, sex, status) values(1, 'liuhongjun', 'M', 1);
INSERT INTO students (id, name, sex, status) values(2, 'pandeyou', 'M', 1);
/**
* 插入证书数据
*
*/
INSERT INTO certs (id, name, status, students_id) values (1, 'ACCP', 1, 1);
INSERT INTO certs (id, name, status, students_id) values (2, 'OSTA', 1, 1);

数据说明:

建好的的数据都是完整的,学员liuhongjun,对应了有两个证书,分别是ACCP和OSTA证书,证书的状态都为1,也就是审核通过的。

所以学员liuhongjun的状态是1,如下:

view plaincopy to clipboardprint?
+----+------------+-----+--------+??
| id | name?????? | sex | status |??
+----+------------+-----+--------+??
| 1 | liuhongjun | F?? |????? 1 |??
| 2 | pandeyou?? | M?? |????? 1 |??
+----+------------+-----+--------+??

+----+------+--------+-------------+??
| id | name | status | students_id |??
+----+------+--------+-------------+??
| 1 | ACCP |????? 1 |?????????? 1 |??
| 2 | OSTA |????? 1 |?????????? 1 |??
+----+------+--------+-------------+

接下来,开始建立触发器,建立触发器代码如下:(触发器语法请参见:http://dev.mysql.com/doc/refman/5.1/zh/triggers.html#create-trigger

view plaincopy to clipboardprint?
/**
* 创建证书触发器
*??
* 名称:trigger_certs
* 触发时间:在certs表更新以后(AFTER)
* 关联表:students
* 执行的事务:如果该学员的证书全部状态都为1时,更新学员的状态为1,否则更新学员的状态为0。
*/
delimiter //??
CREATE TRIGGER trigger_certs AFTER UPDATE ON certs??

FOR EACH ROW BEGIN??
SET @studentsId = OLD.students_id;??
IF OLD.status != NEW.status THEN??
??? SELECT COUNT(id) INTO @total FROM certs c WHERE c.students_id = NEW.students_id AND c.s