在另一个

时间:2016-02-20 13:43:55

标签: 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_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。无法更新存储的表'考试'   函数/触发器,因为它已被调用的语句使用   这个存储的函数/触发器。

(我也尝试将触发器指向另一个表,只是为了查看它的逻辑是否错误,并且它有效)

好的,我无法更新Exam表,因为我在启动触发器的查询中使用它。但是我怎样才能更新表格呢?

1 个答案:

答案 0 :(得分:0)

您不需要插入中的exam表。事实上,逻辑似乎很难遵循,但我认为你只是检查两个条件并插入一行。您可以在FROM中将条件检查为子查询,然后使用CROSS JOIN。 。 。如果其中一个没有返回任何行,则CROSS JOIN不返回任何行。

所以,我认为这个插入符合你的要求:

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;

Follows表的结构非常好奇,包含考试,学生和课程。但这不是你要问的问题。

正如评论中所述,您希望触发器中的new而不是exams