2015-07-21 41 views
1

我有兩個(多對一)表。學生和班級表。班級持有活躍學生人數。如果學生狀態發生變化,則觸發減少一個活躍學生列數。 所以,我寫了一個觸發條件如下:控制字符等價觸發MySQL

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; 

但是,觸發器不更新類表。我認爲,字符控制可能是錯誤的。我怎麼解決這個問題?

謝謝。

回答

1

在mysql中,您可以直接使用新舊關鍵字來引用列數據。

您可以觸發作爲

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表中,並且如果記錄從學生中刪除或者新的記錄被寫入到student表中。

+0

當每個狀態更改請求(狀態0)針對同一個學生ID時,您的觸發器會減少num_of_active_students的1個值。所以,我需要知道舊狀態的價值。 – mcnull

+0

是的,你可以使用'old.status'的東西作爲'new.status ='0'和old.status <>'0'' –

+0

哪些學生的舊地位?我無法看到舊的關鍵字。那麼,你如何使用舊的關鍵字? – mcnull