在插入不同的表后触发更新表

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 修改表后的数据,统一存储到特定的表中,之后通过代码同步两个库的数据

将数据插入另一个表时触发以更新带有时间戳的表

将主键插入第一个表后,如何使用触发器将主键插入另一个表?

插入触发器 SQL。插入新表后如何从另一个表中检索值

触发器导致在视图中使用的表上插入后,如何进行 MYSQL 视图更新

PostgreSQL 相同的触发器函数在 INSERT 上更新到不同的表(使用相同的模式)