【问题标题】:Cannot update a mark by using Store Procedure - MySQL无法使用存储过程更新标记 - MySQL
【发布时间】:2025-12-29 14:25:06
【问题描述】:

我试图使用存储过程来更新标记表中的标记结果。运行脚本时很好,但没有任何改变。有谁知道我在脚本中写错了什么?

以下是有关表格的一些信息:
学生 - 包含 SID 和 CourseID
课程 - CourseID 和 DeptID
部门 - DeptID
模块 - ModuleID 和 DeptID
Mark - ModuleID、SID 和 MarkID

这是我的代码:

Drop procedure if exists coursework.UpdateStudentMark;

DELIMITER //
Create procedure coursework.UpdateStudentMark
(
IN Message varchar(500) ,
IN StudentID text,
IN Academic_Year int,
IN Module_Code_And_Title text,
IN Module_Mark int
)

BEGIN 

insert into logging_table (AuditText, timestamp )
        values ( Message,  now() );

update coursework.mark as mark
 INNER JOIN
   coursework.Modules USING (ModuleID)
          INNER JOIN
    coursework.department USING (DeptID)
    INNER JOIN
    coursework.course USING (DeptID) 
    INNER JOIN
   coursework.student USING (CourseID , SID)
    
set 
Module_Mark = mark.Module_Mark
Where student.StudentID = StudentID  AND student.Academic_Year= Academic_Year AND  Modules.Module_Code_And_Title = Module_Code_And_Title;


END;
//
Delimiter ;

我通过这段代码调用了存储过程:

Call coursework.UpdateStudentMark ('Update Student Stats' ,'B3984673', 2018, 'EEEE3001: Third Year Project [FY]' , 1);

【问题讨论】:

  • 如果您复制/粘贴 update 查询并在另一个工具中运行它,它会按预期更新吗?
  • 我没有其他工具可以运行它,但我可以试试
  • 您不应为参数指定与列或声明变量相同的名称。
  • 非常感谢。我给了一个与声明的变量不同的新名称后解决了它。

标签: mysql sql stored-procedures sql-update add


【解决方案1】:

嗯...如果我错了,请纠正我,但您只是将列更新为自身(设置 mark.Module_Mark = mark.Module_Mark)例如,

update coursework.mark as mark
      <...>
set 
Module_Mark = mark.Module_Mark

【讨论】:

  • 我想如果我使用Module_Mark,它将被称为“UpdateStudentMark”程序的Module_Mark。对吗?
  • 对于 UPDATE 语句,SET 是 = 。也许您的意思是(有效地)set mark.Module_Mark = Module_Mark - 但是,我不确定 mysql 将如何处理模棱两可的名称(例如,列名和名为 Module_Mark 的参数)。
  • 是的,模棱两可的名称是主要问题。非常感谢!!