簡體   English   中英

控制Char等效觸發器MySQL

[英]Control Char Equivalent Trigger 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;

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

謝謝。

在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表中的值,並且如果從學生中刪除了記錄或對student表進行了新輸入,則可能需要添加其他邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM