2012-07-14 26 views
3

我有一个表SCHEDULES_CLASS,其中的2个字段是CLASS_ID(CLASS表的外键),STATUSNUMBER_OF_ENROLLED_STUDENTS。我有其他表CLASS有1个字段MAX_SEATS。更新mysql中触发器中的同一行

当预定班级中的NUMBER_OF_ENROLLED_STUDENTS等于可用于各个CLASS的MAX_SEATS时,我需要将该SCHEDULES_CLASS的状态从初始状态变为“FULL”,即“OPEN”。

我创建了一个触发这一目的如下:

USE mydb; 
DELIMITER ## 
dROP TRIGGER IF EXISTS updateClassStatusTrigger ## 
CREATE TRIGGER updateClassStatusTrigger 
BEFORE UPDATE ON SCHEDULED_CLASS 
    FOR EACH ROW 
    BEGIN 
     UPDATE SCHEDULED_CLASS SET STATUS="FULL" WHERE CLASS_ID=NEW.CLASS_ID 
     AND EXISTS (SELECT 1 FROM SCHEDULED_CLASS sc, CLASS cl WHERE cl.CLASS_ID=NEW.CLASS_ID AND NEW.NUMBER_OF_ENROLLED_STUDENTS=cl.MAX_SEATS); 
END## 

我使用phpMyAdmin,我得到以下错误,当任何更新发生在SCHEDULED_CLASS表:

#1442 - Can't update table 'SCHEDULED_CLASS' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

任何想法,如何完成这项任务?即,只要登记的学生人数达到最大可用座位,就将预定班级的状态更新为“满”。

感谢

+0

为什么你不在业务层而不是使用触发器做到这一点? – CodeZombie 2012-07-14 12:39:11

+0

我正在做这个在php + mysql中,调用mysql的查询。我认为这是一次固定条件下的更新,触发器将是一个很好的选择。谢谢。 – mtk 2012-07-14 13:19:55

回答

6

更新同一行的方式就是SET NEW.column_name = some_Value。为了简化您的触发器,请考虑:

CREATE TRIGGER updateClassStatusTrigger 
BEFORE UPDATE ON SCHEDULED_CLASS 
FOR EACH ROW 
    SET NEW.STATUS='FULL' 

此外,您还需要在给定某些条件的情况下更新值。由于我们不再使用标准UPDATE,因此无法在同一查询中完成此操作。所以,拆分:

USE mydb; 
DELIMITER ## 
dROP TRIGGER IF EXISTS updateClassStatusTrigger ## 
CREATE TRIGGER updateClassStatusTrigger 
BEFORE UPDATE ON SCHEDULED_CLASS 
    FOR EACH ROW 
    BEGIN 
     SELECT EXISTS (SELECT 1 FROM SCHEDULED_CLASS sc, CLASS cl WHERE cl.CLASS_ID=NEW.CLASS_ID AND NEW.NUMBER_OF_ENROLLED_STUDENTS=cl.MAX_SEATS) INTO @row_exists; 
     IF @row_exists THEN 
      SET NEW.STATUS='FULL'; 
     END IF; 
    END## 

我希望我没有在上面的语法错误。我已经在自己的表格上对它进行了测试,但是之后进行了编辑以适合您的模式。

你自己的尝试失败了,因为在触发器内,MySQL不允许你修改触发器执行的表。它无法分析你的查询,以确定你基本上可以用有效的方式完成的尝试 - 它甚至不尝试。它只是禁止修改同一个表。

+0

这非常有帮助。非常感谢 ! – mtk 2012-07-14 13:20:20