有一个学生管理程序,涉及到学生的证书,在这个程序里,学生可以自己添加一个或多个证书,把自己的证书信息添加到系统里,之后管理员对这些信息进行审核,确定证书的真实性。当学员的所有证书都审核通过后,学员的状态就会变为诚信,反之,只要有一个证书没有审核通过,学员状态就变为非诚信。或者是学员又重新上传了一个证书后,学员状态又变为非诚信,当管理员审核通过后,学员状态即改为程序。
学员表结构:(这里为了简单,省去或修改了部分信息)
学员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