在插入不同的表后触发更新表
Posted
技术标签:
【中文标题】在插入不同的表后触发更新表【英文标题】:Trigger to update a table after an insert in a different one 【发布时间】:2016-02-20 13:43:54 【问题描述】:我正在执行这个查询:
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 表,因为我在启动触发器的查询中使用它。但是如何更新表格?
【问题讨论】:
同样的错误,我在触发器中将“Takes.Course_ID”更改为“new.Course_ID”并将“Takes.Exam_ID”更改为“new.Exam_ID”(建议将“Takes”更改为“新”显然删除了它的答案) 【参考方案1】:您不需要插入中的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
。
【讨论】:
以上是关于在插入不同的表后触发更新表的主要内容,如果未能解决你的问题,请参考以下文章
捕获mssqlservice 修改表后的数据,统一存储到特定的表中,之后通过代码同步两个库的数据