我有两个(多对一)表。学生和班级表。班级表保留活跃学生人数。如果学生的状态发生变化,则触发减少一个活动学生列数。 所以,我写了一个触发器如下:
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控制可能是错误的。我该如何解决这个问题?
感谢。
答案 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}}表。