Mysql 触发器,用于在插入其他表后更新表

Mysql 触发器,用于在插入其他表后更新表,mysql,sql,triggers,Mysql,Sql,Triggers,我正在执行此查询: INSERT INTO Takes(Student_SSN_N,Exam_Couse_ID,Exam_ID) SELECT "xxx", "y", "z" FROM Student as S, Exam as E WHERE EXISTS (SELECT * FROM Follows WHERE S.Student_SSN = "xxx" AND S.Student_

我正在执行此查询:

INSERT INTO Takes(Student_SSN_N,Exam_Couse_ID,Exam_ID)
SELECT "xxx", "y", "z"
FROM Student as S, Exam as E
WHERE EXISTS  (SELECT *
                FROM Follows
                WHERE S.Student_SSN = "xxx"
                      AND S.Student_SSN = Follows.Student_SSN_N
                      AND Follows.Course_ID = y
                )
       AND EXISTS (SELECT *
                    FROM Follows
                    WHERE Follows.Course_ID = y
                          AND E.Course_ID = y
                          AND E.Exam_ID = z
                    )
(值x、y、z由用户在java应用程序中给出)

它是有效的,必须参加考试的学生在检查他是否真的遵守了课程以及考试是否与课程本身有关后,被正确地添加到表中。我只是在检查一下检查表

在考试表中,我保留了一个“学生编号”,它告诉你有多少学生需要参加考试。每次在Takes表中插入新学生时,我都要更新此号码。所以我考虑使用触发器,我写了这个:

DELIMITER $$
CREATE TRIGGER `Takes_after_insert` AFTER INSERT ON `Takes` 
    FOR EACH ROW
        UPDATE Exam
        SET Exam.Student_Num = Exam.Student_Num + 1
        WHERE Takes.Course_ID = Exam.Course_ID and
              Take.Exam_ID = Exam.Exam.ID;
这是一个简单的触发器(我还没有研究过更复杂的东西)。但我得到了这个错误:

错误代码:1442。无法更新存储中的表“检查” 函数/触发器,因为调用 此存储函数/触发器

(我还试着将触发器指向另一个表,只是想看看它的逻辑是否错误,结果成功了)


好的,我无法更新检查表,因为我正在启动触发器的查询中使用它。但是如何更新表呢?

插入中不需要
检查
表。事实上,逻辑似乎很难理解,但我认为您只是检查了两个条件并插入了一行。您可以从
中以子查询的形式检查条件,并使用
交叉连接。如果其中一个未返回任何行,则
交叉联接
不返回任何行

因此,我认为本插页符合您的要求:

INSERT INTO Takes(Student_SSN_N, Exam_Couse_ID, Exam_ID)
    SELECT "xxx", "y", "z"
    FROM (SELECT 1
          FROM Follows f
          WHERE f.Student_SSN_N = "xxx" AND
                f.Course_ID = y AND
         ) s CROSS JOIN
         (SELECT 1
          FROM Follows f
          WHERE f.Course_ID = y AND
                E.Exam_ID = z
         ) e;
下面的
表的结构很奇怪,包含考试、学生和课程。但这不是你要问的问题

如评论中所述,您希望触发器中出现
new
,而不是
tests

相同的错误,我将触发器中的“Takes.Course\u ID”更改为“new.Course\u ID”,并将“Takes.Exam\u ID”更改为“new.Exam\u ID”(建议将“Takes”更改为“new”的用户显然删除了其答案)