更新mysql中的触发器中的相同行

时间:2012-07-14 11:59:33

标签: mysql triggers mysql-error-1442

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

当预定班级中的NUMBER_OF_ENROLLED_STUDENTS等于相应CLASS可用的MAX_SEATS时,我需要将初始状态SCHEDULES_CLASS的状态更改为“FULL” “打开”。

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

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. 

任何想法,如何完成这项任务?即,只要注册的学生人数达到最大可用席位,就会将预定课程的状态更新为“FULL”。

由于

1 个答案:

答案 0 :(得分: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不允许您修改执行触发器的表。它无法分析您的查询,以确定您基本上可以尝试以有效的方式完成 - 它甚至没有尝试。它只是禁止修改同一个表。