【问题标题】:#1442 - Can't Update Table#1442 - 无法更新表格
【发布时间】: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 已经回答了你实际上的问题是你正在尝试更新触发器正在调用的同一个表。当触发器调用表上的任何事件时,它将锁定表以执行触发器中提到的任务。在这种情况下,触发器锁定表并再次尝试更新同一个表,这是不可能的。因此,您可以通过事务来实现这一点。在单个事务中,首先插入行,然后更新所需的列,然后提交语句或失败时回滚。

标签: php mysql sql triggers


【解决方案1】:

编辑 1

它适用于插入,我还想在教师更新任何字段标记时触发触发器并更新 FinalMarks.. - Taha Kirmani

您还需要一个具有相同 SET 逻辑的 BEFORE UPDATE 触发器。
但触发器名称和类型应该不同。

示例

DELIMITER //

CREATE DEFINER = `root`@`localhost` 
  TRIGGER `bu_student` BEFORE UPDATE ON `student_marks`
  FOR EACH ROW 
BEGIN
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;
END;
//

DELIMITER ;

原答案

您似乎想通过汇总插入的值来设置特定字段FinalMarks 的值。要完成此操作,您无需在表上显式执行另一个 insert 语句。

相反,您可以在触发器中对字段使用SET 命令,以便它被接受。

改变

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
    )

收件人

CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;

参考
MySQL: CREATE TRIGGER Syntax
查看同一页面上用户评论下的示例之一。

【讨论】:

  • 当我尝试为 before update 执行此操作时,它不会生成任何错误消息,但它也无法正常工作..如果我将其更改为 after update 然后它停止支持 NEW 关键字.
  • 不使用before trigger 是什么意思?发布insert 声明时发生了什么?记录是否存储?如果是,是否相同的值?请解释一下。
  • 检查我更新的答案。我已经为update 触发器添加了代码 sn-p。
  • 之前的数据是什么?你的意见是什么?之后的数据是什么?
  • 我不确定您是如何使用 PHPMyAdmin 的。但是您为什么不在 SQL 编辑器中尝试使用update 语句并提交。然后浏览记录,看看更新是否有效?
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多