控制字符等效触发MySQL

时间:2015-07-21 10:58:55

标签: mysql stored-procedures

我有两个(多对一)表。学生和班级表。班级表保留活跃学生人数。如果学生的状态发生变化,则触发减少一个活动学生列数。 所以,我写了一个触发器如下:

CREATE TRIGGER decreaseNumOfActiveStudent AFTER UPDATE ON student
FOR EACH ROW
BEGIN 
   DECLARE OLD_STATUS CHAR(1);

   SELECT STATUS INTO OLD_STATUS FROM STUDENT WHERE CLASS_ID = NEW.CLASS_ID;

   IF OLD_STATUS = '1' OR OLD_STATUS = 'O' THEN
      IF NEW.STATUS = '2' THEN
         UPDATE CLASS SET NUM_OF_ACTIVE_STUDENT = NUM_OF_ACTIVE_STUDENT - 1
         WHERE CLASS_ID = NEW.CLASS_ID;
      ENDIF;
   ENDIF;
END;

但是,触发器不会更新类表。我认为,char控制可能是错误的。我该如何解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:1)

在mysql中,您可以直接使用new和old关键字来引用列数据。

您可以将触发器设为

delimiter //
create trigger decreaseNumOfActiveStudent after update on student
for each row
begin
 if new.status = '0' then
  update `class` set num_of_active_students = num_of_active_students-1
  where class_id = new.class_id ;
 end if;
end;//

delimiter ;

测试案例

mysql> delimiter //
mysql> create trigger decreaseNumOfActiveStudent after update on student
    -> for each row
    -> begin
    ->  if new.status = '0' then
    ->   update `class` set num_of_active_students = num_of_active_students-1
    ->   where class_id = new.class_id ;
    ->  end if;
    -> end;//
Query OK, 0 rows affected (0.12 sec)

mysql> delimiter ;
mysql> select * from student ;
+----+------+--------+----------+
| id | name | status | class_id |
+----+------+--------+----------+
|  1 | AAA  | 1      |        1 |
|  2 | BBB  | 0      |        1 |
|  3 | CCC  | 1      |        1 |
|  4 | DDD  | 1      |        1 |
|  5 | EEE  | 1      |        1 |
|  6 | FFF  | 1      |        2 |
+----+------+--------+----------+
6 rows in set (0.00 sec)

mysql> select * from class ;
+----------+------------------------+
| class_id | num_of_active_students |
+----------+------------------------+
|        1 |                      4 |
|        2 |                      1 |
+----------+------------------------+
2 rows in set (0.00 sec)

mysql> update student set status = '0' where id = 1 ;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from class ;
+----------+------------------------+
| class_id | num_of_active_students |
+----------+------------------------+
|        1 |                      3 |
|        2 |                      1 |
+----------+------------------------+
2 rows in set (0.00 sec)

请注意,当状态更改回“1”时,您可能需要添加其他逻辑,然后增加class表中的值,以及是否从学生中删除记录或者对{进行新条目{1}}表。