mtk*_*mtk 3 mysql triggers mysql-error-1442
我有一个表SCHEDULES_CLASS,其中2个字段是CLASS_ID(CLASS表中的外键),STATUS以及NUMBER_OF_ENROLLED_STUDENTS.我有其他表CLASS有一个字段作为MAX_SEATS.
当NUMBER_OF_ENROLLED_STUDENTS预定班级等于MAX_SEATS相应CLASS 的可用班级时,我需要将其状态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##
Run Code Online (Sandbox Code Playgroud)
我正在使用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.
Run Code Online (Sandbox Code Playgroud)
任何想法,如何完成这项任务?即,只要登记的学生人数达到最大可用席位,就将预定班级的状态更新为"已满".
谢谢
更新同一行的方法很简单SET NEW.column_name = some_Value.要简化触发器,请考虑:
CREATE TRIGGER updateClassStatusTrigger
BEFORE UPDATE ON SCHEDULED_CLASS
FOR EACH ROW
SET NEW.STATUS='FULL'
Run Code Online (Sandbox Code Playgroud)
现在,此外,您只需要在某些条件下更新值.由于我们不再使用标准,因此无法在此处的同一查询中执行此操作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##
Run Code Online (Sandbox Code Playgroud)
我希望我在上面没有一些语法错误.我已经在自己的表上测试了它,但是然后进行了编辑以适应您的架构.
您自己的尝试失败,因为在触发器内,MySQL不允许您修改执行触发器的表.它无法分析您的查询,以确定您基本上可以尝试以有效的方式完成 - 它甚至没有尝试.它只是禁止修改同一个表.
| 归档时间: |
|
| 查看次数: |
6052 次 |
| 最近记录: |