【发布时间】:2014-04-02 06:49:23
【问题描述】:
我创建了一个触发器来插入 FinalMarks 列中所有数字的总和,每次在 student_marks 表中插入一条新记录。
当我尝试在表中插入新记录时收到以下错误消息。
请告诉我哪里出错了。
谢谢
塔哈
-
CREATE DEFINER = `root`@`localhost` TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
FOR EACH
ROW INSERT INTO student_marks( FinalMarks )
VALUES (
AssignmentMarks + QuizMarks + Hourly1 + Hourly2 + Hourly3 + ProjectMarks
)
错误
INSERT INTO `university`.`student_marks` (
StudentMarksId,StudentId,SemisterCourseId,AssignmentMarks,QuizMarks,Hourly1,Hourly2,Hourly3,FinalMarks,Grades,ProjectMarks,GPA) 价值观( NULL,'1','1','10','15','20','15','10','','','','' )
-
#1442 - #1442 - 无法更新存储函数/触发器中的表“student_marks”,因为它已被调用此存储函数/触发器的语句使用。
【问题讨论】:
-
据我了解,您应该使用“插入后”而不是“插入前”...
-
仍然收到同样的错误信息
-
让我正确理解。您已显示
before insert触发器。然后您在update上收到错误消息。该触发器与错误无关。 -
但是如果我删除触发器,它工作正常..
-
我认为@jmail 已经回答了你实际上的问题是你正在尝试更新触发器正在调用的同一个表。当触发器调用表上的任何事件时,它将锁定表以执行触发器中提到的任务。在这种情况下,触发器锁定表并再次尝试更新同一个表,这是不可能的。因此,您可以通过事务来实现这一点。在单个事务中,首先插入行,然后更新所需的列,然后提交语句或失败时回滚。