Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中更新触发器中的同一行_Mysql_Triggers_Mysql Error 1442 - Fatal编程技术网

在mysql中更新触发器中的同一行

在mysql中更新触发器中的同一行,mysql,triggers,mysql-error-1442,Mysql,Triggers,Mysql Error 1442,我有一个表SCHEDULES\u CLASS,其中的两个字段是CLASS\u ID(来自CLASS表的外键)、STATUS和已注册学生的数量。我有另一个表CLASS有1个字段作为最大座位 当预定班级的注册学生人数等于相应班级的最大可用座位数时,我需要将该预定班级的状态从初始状态“打开”更改为“已满” 我为此创建了一个触发器,如下所示: USE mydb; DELIMITER ## dROP TRIGGER IF EXISTS updateClassStatusTrigger ## CREATE

我有一个表
SCHEDULES\u CLASS
,其中的两个字段是
CLASS\u ID
(来自CLASS表的外键)、
STATUS
已注册学生的数量
。我有另一个表
CLASS
有1个字段作为最大座位

当预定班级的
注册学生人数
等于相应班级的
最大可用座位数
时,我需要将该
预定班级
的状态从初始状态“打开”更改为“已满”

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

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_类表上进行任何更新时,会出现以下错误:

#1442 - Can't update table 'SCHEDULED_CLASS' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 
有什么想法,如何完成这项任务?i、 e.每当注册学生人数达到最大可用座位数时,将计划课程的状态更新为“满”


谢谢

更新同一行的方法是简单地
设置NEW.column\u name=some\u Value
。要简化触发器,请考虑:

CREATE TRIGGER updateClassStatusTrigger
BEFORE UPDATE ON SCHEDULED_CLASS
FOR EACH ROW
  SET NEW.STATUS='FULL'
另外,您只需要在给定某些条件的情况下更新值。这不能在同一查询中完成,因为我们不再使用标准的
更新。因此,拆分:

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

为什么不在业务层而不是使用触发器来执行此操作?我在php+mysql中执行此操作,调用mysql查询。我认为这是一个固定条件下的一次性更新触发器将是一个很好的选择。谢谢,这很有帮助。谢谢!