gpt4 book ai didi

mysql - 在插入另一个表后触发更新表

转载 作者:可可西里 更新时间:2023-11-01 09:03:39 24 4
gpt4 key购买 nike

我正在执行这个查询:

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 应用程序中给出)

有效,必须参加考试的学生在检查他是否真的参加了类(class)以及考试是否与类(class)本身相关之后被正确地添加到表格中。我只是在检查检查表。

在考试表中,我维护了一个“学生编号”,它告诉您有多少学生需要参加考试。每次我在 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.

(我也试过将触发器指向不同的表,只是为了看看它的逻辑是否错误,并且有效)

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

最佳答案

插入时不需要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 表的结构很奇怪,包含考试、学生和类(class)。但这不是您要问的问题。

如评论中所述,您希望在触发器中使用 new 而不是 exams

关于mysql - 在插入另一个表后触发更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35524095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com