5

我有一个表SCHEDULES_CLASS,其中 2 个字段是CLASS_ID(来自 CLASS 表的外键)STATUSNUMBER_OF_ENROLLED_STUDENTS. 我有其他表CLASS有 1 个字段作为 MAX_SEATS。

NUMBER_OF_ENROLLED_STUDENTS预定课程中的课程等于MAX_SEATS相应课程的可用课程时,我需要将其状态SCHEDULES_CLASS从初始状态“打开”更改为“已满”。

为此,我创建了一个触发器,如下所示:

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. 

任何想法,如何完成这项任务?即,每当注册的学生人数达到最大可用座位时,将预定班级的状态更新为“已满”。

谢谢

4

1 回答 1

9

更新同一行的方法是简单地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 不允许您修改执行触发器的表。它无法分析您的查询以确定您基本上尝试过的内容是否可以以有效的方式完成——它甚至不会尝试。它只是禁止修改同一张表。

于 2012-07-14T12:13:26.943 回答