2016-02-20 92 views
3

我執行這個查詢:觸發到插入後更新表中的不同的一個

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; 

這是一個簡單的觸發(我沒有研究過什麼更復雜的還)。但是,我得到這個錯誤:

Error Code: 1442. Can't update table 'Exam' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

(我也嘗試指向觸發不同的表只是爲了看看它的邏輯是錯誤的,它的工作)

好吧,我不能更新考試表,因爲我在啓動觸發器的查詢中使用它。但是我該如何更新表格?

+0

同樣的錯誤,我在觸發器中將「Takes.Course_ID」更改爲「new.Course_ID」和「Takes.Exam_ID」爲「new.Exam_ID」 (建議將「Takes」更改爲「new」的用戶明顯被刪除其答案) – Paul

回答

0

您不需要insert中的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

相關問題