2016-02-20 4 views
3

Я выполнения этого запроса:Trigger обновить таблицу после вставки в другой один

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 
        ) 

(Значения х, у, г задаются пользователем в приложении Java)

It работает, студент, который должен сдать экзамен, правильно добавляется в таблицу после проверки, действительно ли он следует за курсом, и если экзамен относится к самому курсу. Я просто выполняю чек на таблице Экзамена.

В таблице экзамена я поддерживаю «номер студента», в котором рассказывается, сколько студентов нужно сдать экзамен. Я хочу обновлять этот номер каждый раз, когда я вставляю нового ученика в таблицу 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» в триггере (пользователь, который предложил изменить «принимает» на «новый», по-видимому, удален его ответ) – Paul

ответ

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.

Смежные вопросы